C++ 为什么memcpy()和其他类似的函数使用汇编?
我看了一下memcpy和其他函数(memset,memmove,…)背后的代码部分,似乎有很多,还有很多汇编代码 关于这个主题的其他stackoverflow问题提到了这样做的一个原因,可能是因为它包含不同CPU架构的不同代码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中编写“
我亲自编写了我自己的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<代码>以及其他功能,都是用汇编语言编写的,利用处理器的特殊性。