C字符串使用索引或指针复制字符

Jas*_*son 1 c performance gcc x86-64 micro-optimization

我有2个(strcpy)函数的源代码,我想知道哪一个更快,性能更高...

unsigned
strcpy(const char * str, char * des) {
    register const char * ptr = str;

    while ((*des = *str)) {
        str++;
        des++;
    }

    return (str - ptr);
}

unsigned
strcpy2(const char * str, char * des) {
    register unsigned i = 0;

    while ((des[i] = str[i])) i++;

    return i;
}
Run Code Online (Sandbox Code Playgroud)

第一个使用str和des地址,第二个使用索引...第一个使用多余的(++),因此在第一眼看来,由于执行了额外的操作(++),第一个功能的性能低于第二个)中的每个字符,但是当我在GCC中使用(-O3)优化时,结果(汇编代码)告诉我其他信息(第一个strcpy具有更高的性能和更少的动作)

strcpy:
        movzbl  (%rdi), %eax
        movb    %al, (%rsi)
        testb   %al, %al
        je      .L4
        movq    %rdi, %rax
.L3:
        movzbl  1(%rax), %edx
        addq    $1, %rax
        addq    $1, %rsi
        movb    %dl, (%rsi)
        testb   %dl, %dl
        jne     .L3
        subl    %edi, %eax
        ret
.L4:
        xorl    %eax, %eax
        ret
strcpy2:
        movzbl  (%rdi), %eax
        testb   %al, %al
        movb    %al, (%rsi)
        movl    $0, %eax
        je      .L10
.L9:
        leal    1(%rax), %ecx
        movzbl  (%rdi,%rcx), %edx
        movq    %rcx, %rax
        movb    %dl, (%rsi,%rcx)
        testb   %dl, %dl
        jne     .L9
        ret
.L10:
        ret
Run Code Online (Sandbox Code Playgroud)

是真的吗 第一个strcpy具有更高的性能(性能=更少的动作和更快的速度)?

not*_*tan 5

没关系。两者可能都比标准库的strcpy慢。如果您自己没有实现strcpy,那么GCC会做好的内联代码。

现代CPU的性能瓶颈是缓存和RAM带宽,而不是操作码。

  • 不,@ Jason,他们不是在骗你。 (4认同)