struct/classes 是否会以某种方式影响内存填充?

Do struct/classes somehow affect memory padding?

以下代码有 2 个问题:

struct Value
{
  int value
}

void main()
{
  Value v1;
  Value v2;

  int a;
  int b;

  return 0;
}

1) 为什么我的函数中变量的内存地址是向下存储的?
v1 -> 0x00007fff5fbff758
v2 -> 0x00007fff5fbff750

但是例如在我的结构中它们存储在另一个方向? 例如如果 Value 有另一个变量 int value_2;

v1.value -> 0x00007fff5fbff750
v2.value_2 -> 0x00007fff5fbff754

2) 为什么 int a 和 int b 在内存中是连续的,为什么 v1 和 v2 在内存中不是连续的。

有没有我不知道的对齐方式?

编辑:

时隔一年再回到这里。 在重新学习了组装的基础知识之后,这现在变得更有意义了。 我给对底层布局等感兴趣的人的建议。学完C++再看asm,真的很有趣。

1) 由编译器决定变量的存储顺序。可能没有特别的原因,尽管在函数中变量以下推顺序存储在堆栈中,因此如果先推送 v1,然后推送 v2,则 v2 是 'below' v1.

是有道理的

相比之下,结构中的顺序必须遵循声明(它在 C 规范中的某处)。原因是结构可能会覆盖数组或其他内存映射区域,您要确保变量在其中具有特定的顺序和对齐方式。

2) 不确定,但编译器可能决定将结构对齐到 8 字节边界以进行优化(您似乎使用 64 位编译器,所以 8 字节是 'natural' 对齐)。