编译器(G ++)似乎为类的实例分配了比它需要的更多的内存

时间:2011-11-04 03:01:52

标签: c++ gcc assembly compilation x86

我正在学习编译器如何在汇编中表示C ++程序。我有一个关于编译器做的事情的问题,我无法理解。这是一些C ++代码:

class Class1 {
public:
  int i;
  char ch;
};

int main() {
  Class1 cls;
}

使用“g ++ -S”进行编译输出(我已经删除了除函数定义之外的所有内容):

main:
    push    ebp
    mov     ebp, esp
    sub     esp, 16
    mov     eax, 0
    leave
    ret

我不明白行sub esp, 16。为什么它会为此类的实例分配16个字节,在考虑data structure alignment and padding时只需要8个字节?

应该是

[int i - 4 bytes][char ch - 1 byte][padding - 3 bytes]

不应该吗?

当我用类定义编译代码时,还包括一个双精度,即

class Class1 {
public:
  int i;
  char ch;
  double dub;
}; 

它仍然分配了16个字节,在这种情况下是有意义的。

那么为什么编译器在需要8个字节时会分配16个字节?

1 个答案:

答案 0 :(得分:12)

这与堆栈帧对齐有关,而与结构对齐无关。

如果你对对象做了sizeof(),你会看到你对结构对齐和填充的期望。

然而,堆栈帧略有不同。在当今的大多数系统中,堆栈对齐是16字节(或更多)以适应SSE存储器访问。