Shunpower @ 2024-10-17 18:55:49
RT。
众所周知,在结构体中声明变量需要进行繁杂的内存对齐。
对于如下代码:
struct hashtable{
const int mod = 2e7 + 3, base = 503;
pair <ll, int> umap[20000010];
} T;
一部分编译器显示 out of memory,一部分编译器疑似死循环(比如我的 GCC9.2),或者也可能是编译时间过长。
然而:
struct hashtable{
const int mod = 2e7 + 3,base = 503;
ll umap[20000010];
} T;
struct hashtable{
const int mod = 2e7 + 3,base = 503;
ll umap[20000010];
int um[20000010];
} T;
struct hashtable{
const int mod = 2e7 + 3,base = 503;
int um[80000040];
} T;
都可以在相当快的时间内完成编译。
这是 pair 的对齐方式的问题吗?
by DeepSkyCore @ 2024-10-17 18:59:14
神秘,不过
const int mod = 2e7 + 3, base = 503;
struct hashtable{
pair <ll, int> umap[20000010];
} T;
或者
namespace T{
const int mod = 2e7 + 3, base = 503;
pair <ll, int> umap[20000010];
}
好像都没问题
by jason_sun @ 2024-10-17 19:04:54
结构体确实挺神秘的,之前结构体里面定义umap,加cerr就RE,不加就正常
by yukimianyan @ 2024-10-17 19:24:24
struct hashtable{
static constexpr int mod = 2e7 + 3, base = 503;
pair <ll, int> umap[20000010];
} T;
你第一个代码,umap 数组被放进 .data 段里面了,编译出来的可执行文件超级大
by yukimianyan @ 2024-10-17 19:24:57
这可能不是对齐的问题,是初始化器(尤其是默认成员初始化器)的问题 /yun
by yukimianyan @ 2024-10-17 19:29:57
这是不是跟 int inv[10000010] = {0, 1} 一个性质的问题 /yun 不知道为什么啊
by DeepSkyCore @ 2024-10-17 19:34:01
@yukimianyan struct 里面真的可以放 const int 吗,感觉从来没了解过/ll
by yukimianyan @ 2024-10-17 19:35:17
@DeepSkyCore 当然可以(?)和一般的非静态成员一样的待遇(???)
by Shunpower @ 2024-10-18 06:42:19
@yukimianyan 明白了 感谢/bx