C++ 为什么要为char*和w_char*创建未初始化的_copy()的专用版本,而不是其他基本类型?

C++ 为什么要为char*和w_char*创建未初始化的_copy()的专用版本,而不是其他基本类型?,c++,templates,stl,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*和其他基本类型不能以这种方式实现呢 在设计标准时,人们认为可

以下是
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*和其他基本类型不能以这种方式实现呢

在设计标准时,人们认为可以使用一些类似的专门化来提高性能。事实证明,编译器变得更好了,并且从基本模板生成了相同的代码

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


以下是编译器意识到可以使用单个寄存器移动复制8字节字符串的时间

在设计标准时,人们认为可以使用一些类似的专门化来提高性能。事实证明,编译器变得更好了,并且从基本模板生成了相同的代码

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


以下是编译器意识到可以使用单个寄存器移动复制8字节字符串的时间

> C++标准实际上并没有说这些类型应该有代码>未初始化拷贝> /代码>的专门化;它只是要求应该有一个名为
uninitialized_copy
的模板函数,它应该在迭代器范围内工作。然而,C++标准确实允许编译器和库作者在选择函数时实现自己的特殊化。 有很多很好的理由专门化
未初始化的\u copy
来处理单个字符。在某些情况下,编译器提供了
memmove
memcpy
,它们的速度远远快于由于正常优化而通常输出的代码。因此,将此代码专门用于
char
wchar\u t
类型是有意义的,因为这些内部函数的性能优于标准循环

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

简言之,库作者根本不需要提供任何专门化,他们选择了这种专门化,这很好。如果不联系他们,很难说清楚为什么他们不选择对其他类型的人这样做


希望这有帮助

> C++标准实际上并没有说这些类型应该有代码>未初始化拷贝> /代码>的专门化;它只是要求应该有一个名为
uninitialized_copy
的模板函数,它应该在迭代器范围内工作。然而,C++标准确实允许编译器和库作者在选择函数时实现自己的特殊化。 有很多很好的理由专门化
未初始化的\u copy
来处理单个字符。在某些情况下,编译器提供了
memmove
memcpy
,它们的速度远远快于由于正常优化而通常输出的代码。因此,将此代码专门用于
char
wchar\u t
类型是有意义的,因为这些内部函数的性能优于标准循环

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

简言之,库作者根本不需要提供任何专门化,他们选择了这种专门化,这很好。如果不联系他们,很难说清楚为什么他们不选择对其他类型的人这样做


希望这有帮助

据说需要引用。当标准库被设计时,人们相信像这样的一些专业可以用来提高性能。事实证明,编译器做得更好了,不管怎样都可以从基本模板生成相同的代码。@Bo为什么不把它作为一个答案呢?”据说“需要引用。在设计标准库时,人们相信类似这样的一些专门化可以用来提高性能。事实证明,编译器做得更好了,并且从基本模板生成了相同的代码。@Bo为什么不回答这个问题呢?