char a_1[512];
int some_variable;
char a_2[512];
main()
{
...
}
Run Code Online (Sandbox Code Playgroud)
在上面的程序中,我已经声明了一些变量,都在代码的bss部分.考虑到我已经记住了对齐问题,我可以确定为这3个变量分配的内存总是连续的吗?
考虑到我已经记住了对齐问题,我可以确定为这3个变量分配的内存总是连续的吗?
不同的编译器可能以不同的方式对变量进行排序,特别是在它们进行优化时.有些变量甚至可能留在寄存器中,甚至没有任何内存位置.在实践中,一些编译器遵循源的顺序,其他编译器使用一些不同的顺序.
而且你几乎可以定制(或许有些痛苦)你的GCC或你的Clang编译器来改变那个顺序.这确实发生在实践中.例如,最新版本的GCC内核可能配置了一些可以重新排序变量的GCC 插件.使用GCC或Clang,您还可以添加一些变量属性来更改该顺序.
顺便说一句,如果您需要某些特定的订单,您可以将字段打包在某些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
Run Code Online (Sandbox Code Playgroud)
顺便说一句,一些旧版本的GCC有一个可选的优化传递,它在struct
-s中重新排序(在某些情况下)字段(但是最近的GCC删除了该优化传递).
在评论中(应该提出你的问题)你提到了一些bug.考虑使用gdb
调试器及其观察点(和/或valgrind).编译时不要忘记启用所有警告和调试信息(因此gcc -Wall -Wextra -g
使用GCC).也许你想要像等等的仪表选项-fsanitize=address
......
注意未定义的行为.