提问者:小点点

为什么memcpy()和其他类似函数使用汇编?


我看了一下memcpy和其他函数(memset,memmove,。。。)后面的代码部分,似乎有很多,还有很多汇编代码。

关于这个主题的其他stackoverflow问题提到,出现这种情况的原因可能是因为它包含不同CPU体系结构的不同代码。

我用很少的C++代码编写了自己的memcpy/memset函数,并且在用chrono计算时间的100万次迭代中,我总是获得更好的时间。

那么问题来了,为什么程序员不只是用C/C++编写代码,让编译器以它认为最好的方式来解释和优化它呢? 为什么有这么多汇编代码?


共3个答案

匿名用户

“在汇编中重写是毫无意义的”是一个神话。 更准确的表达方式是,很少有程序员具备击败编译器所需的技能。 但它们确实存在,尤其是在那些开发编译器的人中间。

匿名用户

在技术上,用标准C++和C编写memcpy是不可能的,因为您必须依赖于未定义的构造。 其他标准库函数也是如此; memsetmalloc是另外两个示例。

但这不仅仅是原因:如今,一个C和C++标准库实现与一个特定的编译器紧密地结合在一起,使得库的编写者可以拥有你作为使用者所不能拥有的各种自由。 isUppertoupper,&C。 作为一个很好的例子,可以假设一个特定的字符编码。

另一个很好的原因是,熟练的手工装配在性能上很难被击败。

匿名用户

>

  • 编译器通常会生成一些不必要的代码(与手写程序集相比),即使在完全优化级别上也是如此。 这就浪费了内存空间,尤其是在嵌入式系统上,这是很不好的,并且降低了性能。

    你确定你的自定义代码是完整的,完美无瑕的吗? 我不这么认为; 因为当您编写汇编时,您可以完全控制所有的事情,但是当您编译代码时,编译器可能会生成您不想要的东西(这是您的错,不是编译器的错)。

    编译器几乎不可能生成像手写汇编一样完整,同时又比手写汇编小的代码。

    就像有评论提到的,也要看平台。