在类定义上分配的存储

时间:2012-06-25 16:49:12

标签: c++

给出以下定义:

 class C{};

分配了多少空间?在这个阶段创建的方法是什么?现在我认为在实例化之前不会分配空间,但我想这只是部分正确。 编辑: 我检查了我的编译器sizeof(C),但它是1个字节,虽然我没有创建该类的任何对象。

试试此链接 http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=319

3 个答案:

答案 0 :(得分:4)

最有可能的是,大小为1,但仅限于创建类的实例时。对象的大小不能是0。如果您不创建实例,则添加的唯一空间应该是默认成员函数使用的空间,应该对其进行优化。

生成编译器生成的默认构造函数,复制构造函数,移动构造函数,析构函数,赋值运算符和移动赋值运算符,尽管它们什么都不做。

答案 1 :(得分:1)

只有C ++标准保证的是大小不为零。

实现定义了确切的大小。对于空类,大多数实现的大小为1

请注意,只有在某些代码需要这些功能时才会合成默认成员函数。此外,这些函数不会增加类实例的大小。它们不是为每个对象分配的。

Good Read,用Bjarne自己的话来说:
Why is the size of an empty class not zero?

答案 2 :(得分:0)

(以下答案已在GCC 4.4上得到验证。)

C这样简单的非多态类型的定义既不会使可执行文件变大,也不会占用堆栈上的任何空间(或堆上或其他任何地方)。它会在编译时临时扩大编译器的符号表,如果你要求编译器执行此操作,它可能会发出调试符号,但我认为这不是你问题的主旨。否则,C在实例化C类型的实际对象之前不会占用空间,如

C your_c;
C my_c;

为了具有唯一的可寻址性,类型C的每个对象都会占用一个未使用的字节。

现在,要完成:有一个隐藏的中间问题。您的工具链可能会也可能不会将未使用类型的符号作为预链接对象文件的一部分发出 - 名称以“.o”或“.obj”结尾的文件。我的编译器没有(我只是尝试过),但你的可能。

如果所有这一切看起来都太技术性,那么答案的公平近似或总结就是:你的代码没有空间。