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

C++ 为什么memcpy()和其他类似的函数使用汇编?,c++,memory,c++-standard-library,C++,Memory,C++ Standard Library,我看了一下memcpy和其他函数(memset,memmove,…)背后的代码部分,似乎有很多,还有很多汇编代码 关于这个主题的其他stackoverflow问题提到了这样做的一个原因,可能是因为它包含不同CPU架构的不同代码 我亲自编写了我自己的MimcPy/MeMSET函数,用C++代码很少行,在100万次迭代中用时间测量的时间,我总是得到更好的时间。 所以问题是,为什么程序员不只是用C/C++编写代码,让编译器以它认为最好的方式解释和优化代码?为什么汇编代码太多? 在标准C++和C中编写“

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

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

我亲自编写了我自己的MimcPy/MeMSET函数,用C++代码很少行,在100万次迭代中用时间测量的时间,我总是得到更好的时间。


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

在标准C++和C中编写“代码> MycPy < /C>”在技术上是不可能的,因为你必须依赖未定义的构造。其他标准库函数也是如此
memset
malloc
是另外两个例子

<> P>但是这不仅仅是原因:C和C++标准库的实现,现在与一个特定的编译器紧密地结合在一起,以至于图书馆的作者可以采取各种各样的自由,你作为一个消费者,不能。代码>isupper,
toupper
,&c。在可以假定特定字符编码的情况下,这是一个很好的例子


另一个好的原因是熟练的手工装配很难为性能打下。

< P>在标准C++和C中编写“代码> MycPy < /C>”在技术上是不可能的,因为你必须依赖未定义的结构。其他标准库函数也是如此
memset
malloc
是另外两个例子

<> P>但是这不仅仅是原因:C和C++标准库的实现,现在与一个特定的编译器紧密地结合在一起,以至于图书馆的作者可以采取各种各样的自由,你作为一个消费者,不能。代码>isupper,
toupper
,&c。在可以假定特定字符编码的情况下,这是一个很好的例子

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

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

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

为什么程序员不只是用C/C编写代码++

我们不是读心术的人。我们甚至不知道他们写了什么。如果您需要权威的答案,那么您应该询问编写代码的程序员

但是我们可以假设,他们写下他们所做的是因为它很快,并且做了正确的事情

为什么程序员不只是用C/C编写代码++

我们不是读心术的人。我们甚至不知道他们写了什么。如果您需要权威的答案,那么您应该询问编写代码的程序员

但是我们可以假设,他们写下他们所做的是因为它很快,并且做了正确的事情

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

  • 你确定你的自定义代码是完整无瑕的吗?我不这么认为;因为在编写汇编程序时,您可以完全控制所有内容,但在编译代码时,编译器可能会生成您不想要的内容(这是您的错,而不是编译器)

  • 编译器几乎不可能生成与手工编写的程序集一样完整且同时比手工编写的程序集更小的代码

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

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

  • 你确定你的自定义代码是完整无瑕的吗?我不这么认为;因为在编写汇编程序时,您可以完全控制所有内容,但在编译代码时,编译器可能会生成您不想要的内容(这是您的错,而不是编译器)

  • 编译器几乎不可能生成与手工编写的程序集一样完整且同时比手工编写的程序集更小的代码

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


  • memcpy
    memset
    以及其他函数都是在汇编中编写的,以利用处理器特定的指令

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

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

    一些处理器允许有条件地执行指令,这有助于展开循环


    我已经为各种处理器编写了优化的
    memcpy
    memset
    函数。我也花了很多时间来讨论(C)和C++的“最佳”编译器的实现。用C或C++尝试编译器使处理器使用你想要的处理器指令有点困难。

    < P> <代码> MeMCPY 和<代码> MyStuts<代码>以及其他功能,都是用汇编语言编写的,利用处理器的特殊性。