yiming564 @ 2024-11-29 16:29:37
假设全局变量有:
int64_t a, b, f[MaxN], p[MaxN];
我访问 p[-1]
是否会一定访问到 f[MaxN - 1]
?
换句话说,对于 g++-9,全局变量的内存地址上的布局是否和声明顺序一致?
by bsdsdb @ 2024-11-29 16:33:02
@yiming564 应该不是
by bsdsdb @ 2024-11-29 16:33:51
@yiming564
int c[3];
int b[3];
int a[3];
int main() {
c[2] = 114514;
a[2] = 1919810;
cout << b[-1] << endl;
return 0;
}
我这里输出0
by _cbw @ 2024-11-29 16:33:58
开 O2 很可能不是
而且这是未定义行为,编译器可能直接把它优化掉(删掉 or 其它神秘行为
by _cbw @ 2024-11-29 16:35:23
总之这么写可能会挂得很惨
by konyakest @ 2024-11-29 16:37:01
未定义行为
by kbzcz @ 2024-11-29 16:38:02
但这样写确实会挂的很惨吧,没用过linux不知道会不会爆
by Dangerise @ 2024-11-29 16:39:30
@yiming564 未定义行为,开 O2 的情况下什么都可能发生
by yiming564 @ 2024-11-29 16:45:26
好奇怪,我在 Linux 下开不开 O2 都测了,结果都符合预期。
by yiming564 @ 2024-11-29 16:46:11
@bsdsdb int * 3 是 12 个字节会触发内存对齐,所以访问到了 0(也许?)
by bsdsdb @ 2024-11-29 16:47:00
@yiming564 数组大小开到4,初始化下标改成3还是输出0