1

在我的项目中,我们有 1 个用户定义的默认析构函数,它是为遵循项目的一些编码标准要求而编写的。这个析构函数的类被实例化了 200 多次,这增加了整体响应时间,当删除这个析构函数时,我观察到响应时间提高了 28 毫秒。谁能解释为什么会出现这种时间差异,尽管这些只是默认析构函数,但由用户定义,无论如何都会由编译器调用。

使用“用户定义的默认析构函数”我的意思是一个空的析构函数:

~Classname(){ };

什么都不做,只是为了满足项目的标准而添加。

为了更清楚起见,这个析构函数不属于以下类别:

1 .Destructors 声明为“虚拟”。

2 .静态类和单例类的析构函数。

3 .使用'new'关键字创建对象的类的析构函数。

4 .使用'delete'关键字删除对象的类的析构函数。

4

1 回答 1

5

我遇到了几个编译器无法正确识别空析构函数的地方

  • 如果 MSVC 返回具有用户定义的析构函数的对象,则 MSVC 无法内联函数,即使该析构函数为空。

  • is_trivial在我测试过的任何编译器上,诸如 等类型的特征is_pod都无法按照您希望使用空析构函数的方式工作。这可能会改变为特定类型实现某些算法或容器的方式。

  • 用户定义的析构函数可能会更改异常处理代码,因为编译器必须创建代码来展开堆栈。同样,如果我没记错的话,MSVC 也不能为此目的正确识别空析构函数。

  • new T[]如果 T 具有非平凡的析构函数,您所做的每个分配都必须为项目计数分配额外的空间。此外,这可能会改变内存块的对齐方式,这会真正损害性能。MSVC 或 g++ 都没有针对空析构函数正确优化这一点。

于 2012-04-24T19:27:08.350 回答