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

问题描述 投票:0回答:1
char a_1[512];
int some_variable;
char a_2[512];
main()
{
        ...
}

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

c
1个回答
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

顺便说一句,一些旧版本的GCC有一个可选的优化传递,它在struct-s中重新排序(在某些情况下)字段(但是最近的GCC删除了该优化传递)。

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

小心undefined behavior

© www.soinside.com 2019 - 2024. All rights reserved.