C语言中Golang样式延迟范围保护的性能

问题描述 投票:0回答:1

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

golang-style "defer" in C++

我对其中一个答案中给出的类似于go-defer的警卫条款的表现有疑问。它使用shared_ptr删除程序,该删除程序将忽略传递的对象地址。

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

完成延期的以下任何方式会不会有任何区别?

#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";
}
c++ deferred scopeguard
1个回答
0
投票
您可以在此处查看为每个实现构建的内容:godbolt

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

但是,如果您正在寻找性能,为此目的使用std::shared_ptr并不是一个好主意。共享的指针需要分配内存用于资源计数,这对于终结器来说完全没有必要。

std::unique_ptr情况(具有伪变量,因此实际上调用了deleter)将以最小的开销工作。但是,更专注的课堂会更明智。

© www.soinside.com 2019 - 2024. All rights reserved.