1

Given the following definition:

 class C{};

How much space gets allocated? What are the methods created at this stage? Now I thought space is not allocated until instantiation but I guess this is only partly true. Edit: I checked in my compiler sizeof(C) but it is 1 byte though i am not creating any object of the class.

Try this link http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=319

4

3 回答 3

4

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

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

于 2012-06-25T16:52:43.190 回答
1

C++ 标准唯一保证的是大小将非零。

它的实现定义了确切的大小。大多数实现的大小都1为空类。

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

好读,用 Bjarne 自己的话来说:
为什么一个空类的大小不为零?

于 2012-06-25T16:54:43.783 回答
0

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

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

C your_c;
C my_c;

为了能够唯一寻址,每个类型的对象都C占用一个未使用的字节。

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

如果所有这些看起来都太技术化,那么答案的一个公平近似或总结是:您的代码不占用空间。

于 2012-06-25T17:03:01.230 回答