4
为什么T *可以在寄存器中传递,但unique_ptr <T>无法传递?
我正在观看Chandler Carruth在CppCon 2019中的演讲: 没有零成本抽象 在该示例中,他举例说明了您对使用std::unique_ptr<int>over和会产生多少开销而感到惊讶int*。该段大约在时间点17:25开始。 您可以看一下他的示例代码对(godbolt.org)的编译结果 -可以看到,确实,编译器似乎不愿意传递unique_ptr值-实际上,底线是只是一个地址-在寄存器内,仅在直接内存中。 Carruth先生在27:00左右提出的观点之一是,C ++ ABI要求按值传递参数(某些但不是全部;也许-非基本类型?而不是在寄存器中。 我的问题: 这实际上是某些平台上的ABI要求吗?(哪个?)或者在某些情况下可能只是一些悲观? 为什么ABI这样?也就是说,如果结构/类的字段适合寄存器,甚至单个寄存器,为什么我们不能在该寄存器中传递它呢? 近年来,C ++标准委员会是否曾经讨论过这一点? PS-为了不给这个问题留下代码: 普通指针: 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 …