C++ 为什么分配函数通过引用而不是通过值获取std::nothrow\t?

C++ 为什么分配函数通过引用而不是通过值获取std::nothrow\t?,c++,C++,目前,标准库中的分配函数采用常量引用,如: 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 ( st

目前,标准库中的分配函数采用常量引用,如:

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\u t
类型中没有实际数据,它仍然占用(至少)一个字节,在许多ABI中,这意味着(同样,至少)需要从
nothrow
对象中读取一个字节,以便将其传递给
操作符new
。引用它只需要加载对象的地址。所以不,如果性能差异是可以测量的,我不希望按值版本在这里更快。

可能因此不需要调用复制构造函数。@CoffeeandCode我认为复制标记类型很简单,也很快,并且要经过编译器优化。但是它们的实现通常会使某些人很难实例化该类型。你有这样一个ABI的例子吗?在我看来,仅仅因为sizeof(S)==1,就从一个空的结构中读取并复制它似乎很奇怪。如果启用了优化,则更是如此。@ArneVogel不仅因为
sizeof(S)==1
,而且如果
S
是可复制的,这意味着复制可以通过等价的
memcpy
来完成,ABI可以很容易地指定复制必须通过等价的
memcpy
来完成。对于一个真正的实现,虽然我不知道它的ABI是否真的要求这样做,但如果通过值传递它,MSVC实际上会从空结构中读取,即使启用了优化。