为什么编译器为堆栈上的对象分配比sizeof(MyClass)更多的空间?

时间:2018-03-30 23:14:15

标签: c++ oop assembly memory stack

这与我的观点相矛盾。该标准不允许对我有意义的零大小的对象,因为它避免了两个不同的对象共享相同的内存地址,因此空类必须具有至少一个字节的大小。

一个测试这个想法的天真程序:

#include <iostream>

using namespace std;

class MyClass {};

int main()
{
    MyClass myClassInstance;
    std::cout << sizeof(MyClass);
    return 0;
}

正如预期的那样,sizeof(MyClass)是1个字节。

但是,编译器在堆栈上分配恰好16个字节或0x10h。

以下是具体示例:

  • 在第一个例子中,我将使用一个注释对象实例来表明不会对堆栈进行分配。

  • 在第二个中,我可以观察到一个实例将为堆栈分配16个字节。我们可以查看汇编指令sub $0x10, %esp,它从扩展堆栈指针中减去16,从而产生128位的分配大小。

如果对象的大小只有1个字节,为什么编译器会分配16个字节?

0 个答案:

没有答案