一个普通的ctor(或dtor)和一个用户定义的空ctor(或dtor)之间有什么区别

shr*_*ike 11 c++ constructor destructor

当一个类有一个简单的构造函数和/或一个普通的析构函数时,C++标准定义了一些非常具体的行为.

例如,根据标准的§3.8/ 1:

类型对象的生命周期在以下情况T结束:

- 如果T是具有非平凡析构函数(12.4)的类类型,则析构函数调用将启动,或者

- 重用或释放对象占用的存储空间.

所以,

  • 如果一个对象不是可以破坏的,那么在调用析构函数之后访问该对象成员的任何尝试都是UB.
  • 如果一个对象是琐事可破坏的,那么在调用析构函数之后尝试访问该对象的成员是安全的而不是UB.

虽然这个例子可能不是最好的例子,但它表明行为的差异可能是至关重要的(UB /非UB),无论一个对象是否具有琐事可破坏性.

标准的第12.4/3条规定,T如果一个类的析构函数是隐含的,而不是虚拟的,并且如果所有基类和类的成员T都是可以轻易破坏的,那么(对于sumezeze)类的析构函数是微不足道的.

在我的(适度)体验中,我从未在编译器生成的代码方面看到任何区别:

  • 一个有一个普通的默认ctor和/或一个普通的dtor的类,和
  • 具有用户定义的空 ctor和/或非虚拟用户定义的空 dtor的类(只要该类,其基类和成员类也具有非虚拟dtor用户定义的空或平凡)

所以,我的问题是:

  • 以何种方式,用户定义的空ctor/dtor可以或不可以被视为关于编译器代码生成,优化,权衡,...的简单类似的ctor/dtor.
  • 与用户定义的非空ctor/dtor相同的问题; 什么规则应遵循ctor/dtor中实现的代码来将它们视为微不足道的.

我的问题与标准无关(请不要回答标准陈述什么是微不足道的ctor/dtor,所以用户定义的ctor/dtor不是)但是编译器处理用户定义的ctor/dtor的方式以及以何种方式与普通的ctor/dtor相比,编译代码的行为可能会改变(或不改变).

Sco*_*ica 2

您比我更了解标准,但是根据您提供的信息,该标准定义了一个简单的析构函数,但它没有定义一个空的析构函数,这会使这个问题产生误导。普通析构函数是编译器可以优化的特殊情况,虽然空构造函数对我们来说很有意义,但这不是编译器编写者必须考虑的事情。

浏览一些SO链接:

要回答你的第二个问题,只要你的 ctor 非空,它就不是微不足道的。最接近平凡的是一个空的 ctor/dtor,并且您仔细阅读标准已经告诉您,这并不是被定义为平凡的。

TL;DR:该标准定义了一个简单的 dtor,但不是空的。智能编译器可以选择注意到它是用户定义的空并将其视为微不足道,但标准不需要任何此类考虑。