我正在学习编译器如何在汇编中表示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个字节?
答案 0 :(得分:12)
这与堆栈帧对齐有关,而与结构对齐无关。
如果你对对象做了sizeof()
,你会看到你对结构对齐和填充的期望。
然而,堆栈帧略有不同。在当今的大多数系统中,堆栈对齐是16字节(或更多)以适应SSE存储器访问。