C++ MSVC使用用户提供的析构函数生成缓慢的数组销毁代码
为什么在下面的代码中在C++ MSVC使用用户提供的析构函数生成缓慢的数组销毁代码,c++,visual-c++,C++,Visual C++,为什么在下面的代码中在struct Simple中添加一个空的析构函数会使MSVC生成很多在这种情况下本质上是不可操作的代码(我认为) 使用编译器资源管理器可以清楚地看到此问题:。在销毁MSVC编译器的过程中会发生很多事情,而GCC和Clang都只生成一个delete(void*,size\u t)或delete(void*)调用 实际的用例是,我在一个简单的结构中有一个指针,它是.cpp的私有结构,并希望添加断言,以确保在删除这些结构之前,实现逻辑正确地为null ifies指针(将指针值移出
struct Simple
中添加一个空的析构函数会使MSVC生成很多在这种情况下本质上是不可操作的代码(我认为)
使用编译器资源管理器可以清楚地看到此问题:。在销毁MSVC编译器的过程中会发生很多事情,而GCC和Clang都只生成一个delete(void*,size\u t)或delete(void*)调用
实际的用例是,我在一个简单的结构中有一个指针,它是.cpp的私有结构,并希望添加断言,以确保在删除这些结构之前,实现逻辑正确地为null ifies指针(将指针值移出指针)。结构是在堆上分配的,所以优化没有多大帮助。该代码被认为是性能关键的,因此没有std::unique\u ptr
编辑:相关版本:MSVC 2019;GCC 9.2和Clang9.0.0,但我认为任何版本都足够了
edit2:添加析构函数确实会导致明显的性能下降。
=dtor的默认值似乎有所不同。用户定义的析构函数从来都不是微不足道的,即使它是空的。使用~Simple()=默认值代码>取而代之。另请参见和“代码被认为是性能关键的,因此没有std::unique_ptr
”std::unique_ptr
如何影响性能?std::unique_ptr
是一个非常精简的抽象,旨在由编译器优化器完全优化(或者至少减少到你自己无法更有效地实施的事情).出于性能原因而避免使用std::unique_ptr
是一个错误。实际上,在本例中,我们使用unique_ptr与裸指针测量性能差异,并手动调用delete。在这种特定情况下,这是值得的。另一方面,我同意不使用unique_ptr与裸指针几乎总是一个错误。另请参见最近的谈话。无论如何,这有点离题了。=default
对于dtor来说似乎有点不同。用户定义的析构函数从来都不是微不足道的,即使它是空的。使用~Simple()=default;
。另请参阅和“代码被认为是性能关键的,因此没有std::unique\u ptr
”std::unique_ptr
是如何影响性能的?std::unique_ptr
是一个非常精简的抽象,它被设计为完全由编译器优化器优化(或者至少简化为您自己无法更有效地实现的东西).出于性能原因而避免使用std::unique_ptr
是一个错误。实际上,在本例中,我们使用unique_ptr与裸指针测量性能差异,并手动调用delete。在这种特定情况下,这是值得的。另一方面,我同意不使用unique_ptr与裸指针几乎总是一个错误。另请参见最近的谈话。无论如何,这有点离题了。
struct Simple
{
int m_member;
#if 0
inline ~Simple() noexcept {
}
#endif
};
struct Node
{
Simple m_data[2];
};
void Test2(Node* p){
delete p;
}