char a_1[512];
int some_variable;
char a_2[512];
main()
{
...
}
在上面的程序中,我已经声明了一些变量,都在代码的bss部分。考虑到我已经记住了对齐问题,我可以确定为这3个变量分配的内存总是连续的吗?
考虑到我已经记住了对齐问题,我可以确定为这3个变量分配的内存总是连续的吗?
不同的编译器可能会以不同的方式对变量进行排序,特别是当它们是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有一个可选的优化传递,它在struct
-s中重新排序(在某些情况下)字段(但是最近的GCC删除了该优化传递)。
在评论中(应该提出你的问题)你提到了一些bug。考虑using the gdb
debugger及其watchpoints(和/或valgrind)。编译时不要忘记启用所有警告和调试信息(所以gcc -Wall -Wextra -g
与GCC)。也许你想要像instrumentation options等-fsanitize=address
...