首页 文章

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

提问于
浏览
8

我很好奇编译器生成的默认构造函数和析构函数是否内联,因为我可以证明它是正确的 . 一方面,您希望默认构造函数/析构函数不是内联的,以便稍后添加它们不会为每个分配的结构添加构造函数/析构函数调用,而在C中,假定类和结构之间唯一的功能差异成为默认的访问保护 . 也许链接器以某种方式解决这个问题也许答案因编译器而异?

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

3 回答

  • 17

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

    隐式声明的默认构造函数是其类的内联公共成员

    并在 12.4[class.dtor]/3

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

  • 3

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

    理所当然,是的!任何函数(包括构造函数和析构函数)都可以内联声明,并且将函数体放在类定义中是一种方法 . 但是,它取决于编译器是否实际内联函数 .

  • 1

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

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

相关问题