C++ 在C+中执行golang风格的延时范围保护+;

C++ 在C+中执行golang风格的延时范围保护+;,c++,deferred,scopeguard,C++,Deferred,Scopeguard,在阅读了关于在C++中实现Go的延迟的问题之后: 我对其中一个答案中给出的go-defer-like-guard子句的性能提出了一个问题。 它使用一个共享的\u ptr deleter,它忽略传递的对象地址 如果删除程序使用未命名的参数忽略地址,它仍将在堆栈上传递 以下任何一种完成延期的方式会有什么不同吗 #include <memory> #include <iostream> #include <functional> using namespace

在阅读了关于在C++中实现Go的延迟的问题之后:

我对其中一个答案中给出的go-defer-like-guard子句的性能提出了一个问题。 它使用一个共享的\u ptr deleter,它忽略传递的对象地址

如果删除程序使用未命名的参数忽略地址,它仍将在堆栈上传递

以下任何一种完成延期的方式会有什么不同吗

#include <memory>
#include <iostream>
#include <functional>

using namespace std;
using defer = shared_ptr<void>;

int main() {
    defer defer0 (nullptr, [](...) { cout << "defer0\n"; }); // this is the version i've seen

    // but will the performance be any different using any of these?
    shared_ptr<int> defer1(nullptr, [](int* dummy) { cout << "defer1\n"; });
    shared_ptr<int> defer2(nullptr, [](int*) { cout << "defer2\n"; });
    shared_ptr<void> defer3(nullptr, [](void*) { cout << "defer3\n"; });

    unique_ptr<int,void(*)(int*)> defer4(nullptr, [](int*) { cout << "defer4\n"; });

    cout << "Hello\n";
}
#包括
#包括
#包括
使用名称空间std;
使用延迟=共享\u ptr;
int main(){

延迟延迟0(nullptr,[](…){cout您可以在此处查看为每个实现生成的内容:

简而言之,版本0-3之间没有区别,指针在每种情况下都以相同的方式传递给deleter函数

但是,如果您希望获得性能,那么为此使用
std::shared_ptr
不是一个好主意。共享指针需要分配内存进行资源计数,这对于终结器来说是完全不必要的


std::unique_ptr
案例(使用伪变量,因此实际调用了deleter)将以最小的开销工作。但是,一个更专用的类将更明智。

为什么不为此编写一个类,而不是滥用智能指针?它将不适用于
unique\u ptr
,因为它的析构函数不会在null()上调用deleter