2011-06-08 194 views
7

我很好奇,如果编译器生成的默认构造函数和析构函数是内联或不是,因为我可以证明它的任何方式。一方面,您希望默认构造函数/析构函数为而不是为内联,以便稍后添加它们不会中断ABI(因为只有默认值时编译的对象文件将内置生成的定义而不是您定义的内容)。另一方面,为了让C++编译器能够编译C代码,并且能够在使用C编译器编译时执行它,它不能为每个分配的结构添加构造函数/析构函数调用,并且在C++中,类之间唯一的功能差异并且一个结构应该是默认的访问保护。也许链接器解决这个问题?也许答案在编译器中有所不同?默认构造函数和析构函数是否内联?

这个问题的后果:如果我在C++中有一个POD结构,我理论上可以通过定义空的内联构造函数/析构函数来取代默认值,从而在某些编译器下受益?

+0

'class'和'struct'关键字之间的区别是不应该的。 – 2011-06-08 03:50:49

+0

@Luc:假设这是一种暗箱,我可以看到编译器不符合标准。 – 2011-06-08 03:54:48

回答

16

C++标准说,在12.1 [class.ctor]/5

的隐式声明的缺省构造器是它的类的一个内联公共构件

12.4 [class.dtor]/3

隐含声明的 析构函数是同级内部公共会员。

+0

我认为它与'inline'关键字非常相似 - 编译器可以自由地运用它自己的判断,并且需要*不*实际内联构造函数,如果它太大...是您的理解吗? – 2011-06-08 09:08:57

+0

@Tony我会这样想,是的。 7.1.2/2自引用地说:“在调用点执行这种内联替换不需要实现;但是,即使省略了这种内联替换,7.1.2定义的内联函数的其他规则也应仍然受到尊重“ – Cubbi 2011-06-08 10:09:38

3

如果我在C++中有一个POD结构,我理论上可以在某些编译器下通过定义空的内联构造函数/析构函数来替代缺省值吗?

在理论上,是的!任何函数(包括构造函数&析构函数)都可以内联声明,并且将函数体放入类定义中是实现此目的的一种方法。但是,如果它实际上内联函数,则由编译器决定。

+0

这不能解决我的问题。我问是否默认编译器生成的构造函数/析构函数是内联的。 – 2011-06-08 03:47:57

+0

@Joseph Garvin:我相信编译器和编译器会有所不同,它会如何影响您编写实现的方式? – 2011-06-08 03:50:43

+0

@Als:我编辑了我的问题,以便在底部包含一个可能很重要的方法。 – 2011-06-08 03:52:45

1

它在不同的编译器中有所不同,但总的来说:是的,它们应该。

使用gcc至少可以同时生成内联和外联函数。超线程版本被标记为“链接一次”,因此无论有多少对象生成默认构造函数,最多只有一个版本会在链接的输出中结束。如果实际上没有人使用默认的构造函数,那么它根本不包含在链接的输出中,并且实际上有一个纯粹的内联函数。

+0

不,该标准要求将它们内联。 – 2011-06-08 06:42:50

+2

@Gene,没有标准要求他们是'内联',这不是一回事。 – 2011-06-08 06:55:09

相关问题