同一部分的内存是否总是连续分配?

时间:2017-12-21 06:35:39

标签: c

char a_1[512];
int some_variable;
char a_2[512];
main()
{
        ...
}

在上面的程序中,我已经声明了一些变量,都在代码的bss部分。考虑到我已经记住了对齐问题,我可以确定为这3个变量分配的内存总是是连续的吗?

1 个答案:

答案 0 :(得分:6)

  

考虑到我记住了对齐问题,我可以确定为这3个变量分配的内存总是连续的吗?

当然。阅读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
BTW,一些旧版本的GCC有一个可选的优化传递,它在struct - s中重新排序(在某些情况下)字段(但最近的GCC删除了该优化传递)。

在评论中(应该提出你的问题)你提到了一些bug。考虑using the gdb debugger及其watchpoints(和/或valgrind)。不要忘记在编译时启用所有警告和调试信息(所以gcc -Wall -Wextra -gGCC)。也许你还需要像-fsanitize=address那样的instrumentation options等......

谨防undefined behavior

相关问题