我正在学习编译器如何代表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
我不明白线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个字节呢?
解决方法
这与栈框对齐有关,而不是结构对齐.
如果你在对象上做了一个sizeof(),你会看到你期望的结构对齐和填充.
但是,堆栈框架略有不同.在今天的大多数系统中,堆栈对齐是16字节(或更多),以适应SSE内存访问.