为什么为char *和w_char *而不是其他原始类型创建unintialized_copy()的专用版本?

时间:2013-04-02 08:42:40

标签: c++ templates stl

以下是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 *和其他基本类型?

2 个答案:

答案 0 :(得分:1)

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

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

当编译器意识到可以使用单个寄存器移动复制8字节字符串时,这是my favorite exemple

答案 1 :(得分:0)

C ++标准实际上并没有说这些类型应该有uninitialized_copy的特化;它只是要求应该有一个名为uninitialized_copy的模板函数,它应该适用于迭代器范围。但是,C ++标准允许编译器和库作者在他们选择的情况下实现他们自己的特殊功能。

uninitialized_copy专门用于处理个别角色有很多充分的理由。在某些情况下,编译器为memmovememcpy提供的intrinsics比正常优化时通常输出的代码快得多。因此,将charwchar_t类型的代码专门化是有意义的,因为这些内在函数会胜过标准循环。

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

简而言之 - 图书馆的作者根本不需要提供任何专业化,他们选择加入这种专业化很不错。没有联系他们,很难明确说明为什么他们没有选择为其他类型做这件事。

希望这有帮助!