struct / classes以某种方式影响内存填充吗?

时间:2017-04-11 11:40:07

标签: c++ memory alignment memory-alignment

以下代码有两个问题:

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 个答案:

答案 0 :(得分:0)

1)编译器确定变量的存储顺序。可能没有特别的原因,尽管在函数变量中按下推顺序存储在堆栈中,所以如果首先推送v1,那么v2有意义v2是'低于'v1。

相反,结构中的顺序必须遵循声明(它在C规范中的某个位置)。原因是结构可能覆盖数组或其他内存映射区域,您希望确保变量按特定顺序和对齐方式。

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