在阅读了有关在C ++中实现Go的延迟的问题之后:
我对其中一个答案中给出的类似于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";
}
总之,版本0-3之间没有区别,在每种情况下,指针都以相同的方式传递给deleter函数。
但是,如果您正在寻找性能,为此目的使用std::shared_ptr
并不是一个好主意。共享的指针需要分配内存用于资源计数,这对于终结器来说完全没有必要。
std::unique_ptr
情况(具有伪变量,因此实际上调用了deleter)将以最小的开销工作。但是,更专注的课堂会更明智。