char a_1[512];
int some_variable;
char a_2[512];
main()
{
...
}
在上面的程序中,我声明了一些变量,都在代码的 bss 部分。考虑到我牢记对齐问题,我可以确定为这 3 个变量分配的内存将始终 是连续的吗?
最佳答案
Considering that I have kept in mind the alignment issues, can I be sure that the memory allocated for those 3 variables will always be contiguous?
当然不是。阅读 C11标准n1570 ,你不会找到任何关于这一点的保证。
不同的编译器可能会对变量进行不同的排序,特别是当它们是 optimizing 时。 .有些变量甚至可能保留在寄存器中,甚至没有任何内存位置。在实践中,一些编译器遵循源代码的顺序,其他编译器使用一些不同的顺序。
而且您实际上可以自定义(可能会有些痛苦)您的 GCC或者你的 Clang编译器更改该顺序。这确实发生在实践中。例如,最新版本的 GCC 内核可能配置了一些 GCC plugin这可以重新排序变量。使用 GCC 或 Clang,您还可以添加一些 variable attribute更改该顺序。
顺便说一句,如果您需要一些特定的顺序,您可以将字段打包在一些 struct
中,例如代码:
struct {
char a_1[512];
int some_variable;
char a_2[512];
} my_struct;
#define a_1 my_struct.a_1
#define some_variable my_struct.some_variable
#define a_2 my_struct.a_2
顺便说一句,一些旧版本的 GCC 有一个可选的优化 channel ,它重新排序(在某些情况下)struct
-s 中的字段(但最近的 GCC 删除了那个优化 channel )。
在评论(应该进入您的问题)中,您提到寻找一些错误。考虑 using the gdb
debugger及其 watchpoints (和/或 valgrind )。编译时不要忘记启用所有警告和调试信息(所以 gcc -Wall -Wextra -g
和 GCC )。也许你也想要instrumentation options像 -fsanitize=address
等等...
关于c - 同一部分中的内存是否总是连续分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47919255/