C++ 结构/类是否会影响内存填充?

C++ 结构/类是否会影响内存填充?,c++,memory,alignment,memory-alignment,C++,Memory,Alignment,Memory Alignment,以下代码包含2个问题: struct Value { int value } void main() { Value v1; Value v2; int a; int b; return 0; } 1) 为什么变量的内存地址存储在函数中? v1->0x00007fff5fbff758 v2->0x00007fff5fbff750 但例如,在我的结构中,它们存储在另一个方向? e、 g.如果值有另一个变量int值_2 v1.value->0x00007fff5fbf

以下代码包含2个问题:

struct Value
{
  int value
}

void main()
{
  Value v1;
  Value v2;

  int a;
  int b;

  return 0;
}
1) 为什么变量的内存地址存储在函数中?
v1->0x00007fff5fbff758
v2->0x00007fff5fbff750

但例如,在我的结构中,它们存储在另一个方向? e、 g.如果值有另一个变量int值_2

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

(二) 为什么INTA和INTB在内存中是连续的,为什么v1和v2在内存中不是连续的

有什么我不知道的对齐方式吗

编辑:

一年后再回到这一点。 在重新学习了组装的基础知识之后,现在这就更有意义了。 我对任何对基础布局感兴趣的人的建议等。在学习C++之后,重新访问ASM,这很有趣。

< P > 1)编译器决定变量存储的顺序。可能没有什么特别的原因,尽管函数中的变量是按下推顺序存储在堆栈上的,所以如果先推v1,然后再推v2,则v2“低于”v1是有意义的

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


2)不确定,但是编译器可能决定将结构对齐到8字节边界进行优化(你似乎使用了一个64位编译器,所以8字节是一个‘自然C++’)。它们是不同的,C没有

class
es。您可以有填充,也可以没有填充,变量可以按任意顺序存储。所有这些都是完全依赖于实现的。在你的代码中没有<代码> ValueO2。使用高级语言的原因是,你不需要知道C++中的任何一种对齐方式(大多数情况下),在一个范围内自动存储持续时间的对象的顺序是未指定的。它们之间的填充也未指定。8字节对齐似乎是正确的,因为如果我向结构中添加更多变量,并且它超过8字节,它将是16字节对齐的,但是为什么这种对齐与结构中的对齐不同?据我所知,结构中的变量与“最大类型”对齐这种8字节对齐是否也会影响缓存线?由于我的对象只使用4个字节,但8个字节对齐(用于优化),它实际上浪费了缓存线的空间,对吗?可以假设缓存线针对寄存器宽度进行了优化,反之亦然,即结构针对缓存线进行了优化。但这都是所谓“编译器优化”的黑暗巫术的一部分:)是的,您可能会浪费4个字节,但性能会更好。如果需要的话,可能有一些pragma选项可以强制使用更小的结构。如果我们使用std::array和C-array,它们应该具有相同的性能,但是std::array更易于使用。由于使用时对象内存对齐,数组实际上会有一点开销。即使我们永远不会注意到开销,这个小开销仍然存在,对吗?(这只是一个例子)