默认构造函数和析构函数是否内联?

时间:2011-06-08 03:41:41

标签: c++ c inline binary-compatibility abi

我很好奇编译器生成的默认构造函数和析构函数是否内联,因为我可以证明它是正确的。一方面,您希望 not 的默认构造函数/析构函数是内联的,以便稍后添加它们不会破坏ABI(因为只有默认值时编译的目标文件才会内联生成的定义而不是你定义的)。另一方面,对于C ++编译器来编译与使用C编译器编译时相同的C代码,它不能为每个分配的结构添加构造函数/析构函数调用,而在C ++中,类的唯一功能区别是并且结构应该是默认的访问保护。也许链接器以某种方式解决这个问题也许答案因编译器而异?

这个问题的结果是:如果我在C ++中有一个POD结构,理论上我可以在一些编译器中通过自己定义空内联构造函数/析构函数来代替默认值吗?

3 个答案:

答案 0 :(得分:17)

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

中说
  

隐式声明的默认构造函数是其类

的内联公共成员

并在 12.4 [class.dtor] / 3

  

隐式声明   析构函数是其类的内联公共成员。

答案 1 :(得分:3)

  

如果我在C ++中有一个POD结构,理论上我可以通过自己定义空内联构造函数/析构函数代替默认值来在一些编译器中受益吗?

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

答案 2 :(得分:1)

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

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