c – 编译器(G)似乎为它所需要的类的实例分配更多的内存

c – 编译器(G)似乎为它所需要的类的实例分配更多的内存,第1张

概述我正在学习编译器如何代表C程序在汇编中.我有一个关于编译器做的事情的问题,我无法理解.这里有一些C代码: class Class1 {public: int i; char ch;};int main() { Class1 cls;} 使用“g -S”编译输出(除了功能定义,我已经删除了所有内容): main: push ebp mov ebp, 我正在学习编译器如何代表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内存访问.

总结

以上是内存溢出为你收集整理的c – 编译器(G)似乎为它所需要的类的实例分配更多的内存全部内容,希望文章能够帮你解决c – 编译器(G)似乎为它所需要的类的实例分配更多的内存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1233647.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存