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