1

这是 的专业化版本char*

inline char* uninitialized_copy(const char* first, const char* last, char* result)
{
  memmove(result, first, last-first);
  return result + (last - first);
}

据说 memmove 是 char* 和 w_char* 实现该方法最有效的方式。但是为什么 int* 等基本类型不能这样实现呢?

4

2 回答 2

1

在设计标准时,人们相信像这样的一些专业化可以用来提高性能。事实证明,编译器变得更好,并且无论如何都从基本模板生成相同的代码。

许多当前的编译器甚至具有memmove内置函数并在它们可以利用已知对齐或当对象的大小恰好是寄存器大小的偶数倍时生成改进的内联版本。

这是我最喜欢的示例,当编译器意识到可以使用单个寄存器移动来复制 8 字节字符串时。

于 2013-04-18T19:51:10.760 回答
0

C++ 标准实际上并没有说应该uninitialized_copy对这些类型进行专门化;它只是要求应该有一个调用的模板函数uninitialized_copy应该在迭代器范围内工作。但是,C++ 标准确实允许编译器和库的作者实现他们自己的这个函数的特化,如果他们选择这样做的话。

有很多充分的理由专门uninitialized_copy研究单个角色。在某些情况下,编译器提供了内在函数memmove并且memcpy由于正常优化,它们比它们通常输出的代码要快得多。因此,专门针对charandwchar_t类型的代码是有意义的,因为这些内在函数将优于标准循环。

我很难确切地说出图书馆作者为什么专门研究其他类型。我的猜测是他们对此进行了测试,并没有发现太大的性能差异。由于库作者在提供标准模板版本之上所做的任何事情都uninitialized_copy超出了规范的要求,这可能只是因为他们很忙,需要处理其他事情。您必须直接与他们联系以获得更明确的答案。

简而言之 - 图书馆作者根本不需要提供任何专业化,他们选择加入这个专业化是很好的。如果不联系他们,很难明确地说出他们为什么不选择为其他类型这样做。

希望这可以帮助!

于 2013-04-18T19:57:24.413 回答