【问题标题】:Where can I find the real memcpy() implementation?我在哪里可以找到真正的 memcpy() 实现?
【发布时间】:2020-11-11 10:35:08
【问题描述】:

First hit for memcpy source code c。该实现是一个 while 循环,一次复制一个字节。尽管许多答案清楚地表明,实际实现比一次复制一个字节要快得多。我在哪里可以找到真正的实现,编译器实际使用的真正的、经过高度优化的实现?它在 C 中是什么样子的?

寻求书籍、工具、软件库等方面的建议

不是真的。我问的是现有实现是如何工作的,而不是我应该使用哪个库等。

【问题讨论】:

  • @OlSen 我不知道。无论 GCC 的真正 memcpy() 实现使用什么。
  • 什么“真正的”实现?对于什么硬件?适用于什么操作系统?
  • @AndrewHenle GCC,Linux。
  • 仍然不够具体。 x86、x86-64、arm、所有不同代的 x86-64 芯片有不同的实现,大缓冲区和小缓冲区的不同实现,以及在优化大小和速度等时,等等。它不是一个“的”。

标签: c memcpy


【解决方案1】:

定义 C 库不是编译器的工作。 C 库函数是 C 库的职责。例如,gcc 负责诸如软浮点函数之类的事情,以便可以针对特定目标完全实现该语言。作为编译器的核心 stdint.h 函数定义了语言特定变量类型(char、short、int 等)的大小,而 stdint.h 是从中派生的,因此只有编译器可以定义这些。

但是 C 库项目、引导程序、链接器脚本和所有 C 库函数、printf()、memcpy() 等。至少在 gnu 世界中,编译器、汇编器/链接器、C 库等是单独的项目,例如,您可以混合使用 gcc、binutils 和 glibc,或者您可以改用 gcc、binutils 和 newlib。并且没有理由期望 glibc 和 newlib 或任何其他 C 库具有相同的 memcpy 实现。

可以集成其他工具链和库。

当然你可以用一行 memcpy(...) 编译成一个简单的测试程序然后反汇编它。

memcpy 是一个特殊的交易,因为一些编译器会生成一个 memcpy,有时也可能以其他方式删除 memcpy 并用一些指令替换它。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned int fun ( unsigned int *x )
{
    unsigned int y;
    memcpy(&y,x,sizeof(unsigned int));
    return(y);
}

Disassembly of section .text:

0000000000000000 <fun>:
   0:   8b 07                   mov    (%rdi),%eax
   2:   c3                      retq 


typedef struct
{
    unsigned int ui[37];
    unsigned short us[33];
    unsigned char uc[31];
} HELLO;
HELLO one;
void fun ( HELLO two )
{
    one=two;
}

00000000 <fun>:
   0:   e24dd010    sub sp, sp, #16
   4:   e92d4010    push    {r4, lr}
   8:   e28dc008    add ip, sp, #8
   c:   e88c000f    stm ip, {r0, r1, r2, r3}
  10:   e1a0100c    mov r1, ip
  14:   e3a020f8    mov r2, #248    ; 0xf8
  18:   e59f000c    ldr r0, [pc, #12]   ; 2c <fun+0x2c>
  1c:   ebfffffe    bl  0 <memcpy>
  20:   e8bd4010    pop {r4, lr}
  24:   e28dd010    add sp, sp, #16
  28:   e12fff1e    bx  lr
  2c:   00000000    .word   0x00000000

并且一些编译器可以选择请求/要求它们不插入 memcpy 或您没有要求的其他库函数。

如果 memcpy 在链接时间内仍然存在,那么链接器被告知链接的内容就是链接的内容。

【讨论】:

    【解决方案2】:

    我在哪里可以找到真正的实现,真正的,

    “真实”这个词在这里没有意义。一切都是“真实的”。

    高度优化

    “重”这个词是主观的。

    编译器实际使用的那个?

    只要副作用保持不变,编译器可能会以不同的方式优化memcpy。所以我想这会使两个实现可用,所以编译器可能有一个类似“编译时”memcpy 的内部实现,而 C 标准库可能会提供一个单独的 memcpy 实现。

    它在 C 中是什么样子的?

    有很多可用的implementations of C standard library 并且每个都有自己的memcpy 实现,甚至每个都可能有(并且有)不同的 memcpy 实现不同的架构。出于优化目的,某些 C 标准库实现有时会在汇编中为特定架构选择实现 memcpy。例如,您可以找到 newlibs generic memcpynewlib's memcpy for arm in assemblyglibc generic memcpyglibc i386 memcpy implementation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 2011-03-11
      • 2019-07-31
      • 2018-06-15
      • 2019-05-01
      相关资源
      最近更新 更多