我看了一下memcpy和其他函数(memset,memmove,。。。)后面的代码部分,似乎有很多,还有很多汇编代码。
关于这个主题的其他stackoverflow问题提到,出现这种情况的原因可能是因为它包含不同CPU体系结构的不同代码。
我用很少的C++代码编写了自己的memcpy/memset函数,并且在用chrono计算时间的100万次迭代中,我总是获得更好的时间。
那么问题来了,为什么程序员不只是用C/C++编写代码,让编译器以它认为最好的方式来解释和优化它呢? 为什么有这么多汇编代码?
“在汇编中重写是毫无意义的”是一个神话。 更准确的表达方式是,很少有程序员具备击败编译器所需的技能。 但它们确实存在,尤其是在那些开发编译器的人中间。
在技术上,用标准C++和C编写memcpy
是不可能的,因为您必须依赖于未定义的构造。 其他标准库函数也是如此; memset
和malloc
是另外两个示例。
但这不仅仅是原因:如今,一个C和C++标准库实现与一个特定的编译器紧密地结合在一起,使得库的编写者可以拥有你作为使用者所不能拥有的各种自由。 isUpper
,toupper
,&C。 作为一个很好的例子,可以假设一个特定的字符编码。
另一个很好的原因是,熟练的手工装配在性能上很难被击败。
>
编译器通常会生成一些不必要的代码(与手写程序集相比),即使在完全优化级别上也是如此。 这就浪费了内存空间,尤其是在嵌入式系统上,这是很不好的,并且降低了性能。
你确定你的自定义代码是完整的,完美无瑕的吗? 我不这么认为; 因为当您编写汇编时,您可以完全控制所有的事情,但是当您编译代码时,编译器可能会生成您不想要的东西(这是您的错,不是编译器的错)。
编译器几乎不可能生成像手写汇编一样完整,同时又比手写汇编小的代码。
就像有评论提到的,也要看平台。