gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:55:53 26 4
gpt4 key购买 nike

我正在学习编译器如何在汇编中表示 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 这行。当您考虑到 data structure alignment and padding 时,为什么它会为此类只需要 8 个字节的实例分配 16 个字节? ?

应该是

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

不应该吗?

当我用类定义编译代码时也包括一个 double ,即

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

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

那么为什么编译器只需要 8 个字节就分配 16 个字节呢?

最佳答案

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

如果您对您的对象执行了 sizeof(),您将看到您期望的结构对齐和填充。

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

关于c++ - 编译器 (G++) 似乎为类的实例分配了比它需要的更多的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8004458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com