Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MSVC使用用户提供的析构函数生成缓慢的数组销毁代码_C++_Visual C++ - Fatal编程技术网

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;
}