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

问题描述 投票:0回答:2

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

其他关于这个话题的stackoverflow问题中提到,一个原因可能是它包含了不同CPU架构的不同代码。

我个人用极少的C++代码行编写了自己的memcpymemset函数,在100万次的迭代中,用chrono测量的时间,我一直得到较好的时间。

那么问题是,为什么程序员不直接用CC++写代码,让编译器按照它认为最好的方式来解释和优化呢?为什么要写那么多汇编代码?

c++ memory c++-standard-library
2个回答
2
投票

这个 "用汇编重写毫无意义 "是个神话。更准确的表达方式是,很少有程序员拥有打败编译器的技术。但他们确实存在,尤其是在开发编译器的人中。


2
投票

从技术上讲,要写出 memcpy 在标准的C++和C语言中,因为你必须依赖未定义的结构。其他标准库函数也是如此。memsetmalloc 是另外两个例子。

但这不是唯一的原因。一个C和C++标准库的实现,在这些日子里,与一个特定的编译器是如此紧密地结合在一起,以至于库的编写者可以采取各种各样的自由,而你,作为一个消费者,却不能。isupper, toupper,&c.就是很好的例子,在这里可以假设一个特定的字符编码。

另一个很好的原因是,专家级的手工汇编在性能上很难被打败。


1
投票
  1. 编译器通常会生成一些不必要的代码(与手工编写的汇编相比),即使在完全优化的情况下。这浪费了内存空间,特别是在嵌入式系统上,并降低了性能。

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

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

  4. 正如一些评论中提到的,这也取决于平台。


1
投票

这个 memcpymemset 以及其他功能,都是用汇编编写的。以利用处理器的特定指令.

例如,ARM处理器有一个功能,可以用一条指令从连续的位置加载多个寄存器。 还有存储多条指令,可以将多个寄存器存储到连续的位置。 Intel x86有块状读写指令。

汇编语言允许用一个32位寄存器复制4个8位字节。

有些处理器允许有条件地执行指令,这在推出循环时有帮助。

我曾写过优化的 memcpymemset 各种处理器的函数。 我也花了很多时间与编译器争论(讨论)C和C++的 "最佳 "实现。 用C或C++想让编译器使用你想要的处理器指令是有点困难的。


0
投票

为什么程序员不直接用CC++写代码呢?

我们不是读心者 我们甚至不知道 什么 他们写的。如果你需要一个权威的答案,那么你应该问写代码的程序员。

但我们可以假设,他们写的东西是因为速度快,做的事情正确。

© www.soinside.com 2019 - 2024. All rights reserved.