为什么分配函数使用std::nothrow_t作为引用而不是值

Why allocation functions take std::nothrow_t by reference rather than by value?

本文关键字:引用 函数 分配 nothrow std 为什么      更新时间:2023-10-16

目前,标准库中的分配函数通过const引用std::nothrow_t,如:

void* operator new  ( std::size_t count, const std::nothrow_t& tag);
void* operator new[]( std::size_t count, const std::nothrow_t& tag);

既然std::nothrow_t只是一个用于调度目的的标记类型,那么按值取它不是更简单而且(可能)更有效吗?例如:

void* operator new  ( std::size_t count, std::nothrow_t tag);
void* operator new[]( std::size_t count, std::nothrow_t tag);

const参考设计背后的基本原理是什么?

如果这个版本的new的典型用法是将其称为new(nothrow_t()) T,那么您将有一个很好的观点。但这不是典型的用法,典型的用法是new(nothrow) T,其中nothrow被声明为extern const std::nothrow_t nothrow;。即使在nothrow_t类型中没有实际的数据,它仍然(至少)占用一个字节,并且在许多abi中,这意味着(再次,至少)需要从nothrow对象中读取一个字节,以便将其传递给operator new。通过引用来获取它只需要加载对象的地址。所以,不,如果性能差异是可测量的,我不希望按值版本在这里更快。