最佳答案
我正在看 Chandler Carruth 在2019年 CppCon 上的演讲:
在书中,他给出了一个例子,说明他是如何惊讶于在 int*
上使用 std::unique_ptr<int>
会产生多大的开销; 这个片段大约在时间点17:25开始。
你可以看一下他的示例对代码片段(Godbolt.org)的 编制结果,你会发现,编译器似乎并不愿意在寄存器中传递惟一的 _ ptr 值——实际上在底行只是一个地址——只在直接内存中传递。
Carruth 先生在27:00左右提出的一个观点是,C + + ABI 需要 by-value 参数(一些但不是全部; 也许是非原语类型?非微不足道的可构造类型?)在内存中传递,而不是在寄存器中传递。
我的问题是:
另外,为了避免这个问题没有代码:
简单的说:
void bar(int* ptr) noexcept;
void baz(int* ptr) noexcept;
void foo(int* ptr) noexcept {
if (*ptr > 42) {
bar(ptr);
*ptr = 42;
}
baz(ptr);
}
唯一指针:
using std::unique_ptr;
void bar(int* ptr) noexcept;
void baz(unique_ptr<int> ptr) noexcept;
void foo(unique_ptr<int> ptr) noexcept {
if (*ptr > 42) {
bar(ptr.get());
*ptr = 42;
}
baz(std::move(ptr));
}