首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用索引或指针复制字符的C字符串

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

Stack Overflow用户
提问于 2019-08-02 19:29:08
回答 2查看 143关注 0票数 1

我有两个(strcpy)函数的源代码,我想知道哪个更快,性能更好…

代码语言:javascript
复制
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;
}

第一个使用字符串和des地址,第二个使用索引...第一个函数有一个额外的(++),所以乍一看,第一个函数的性能比第二个函数差,因为我为每个字符做了额外的(++)优化,但当我在GCC中使用(-O3)优化时,结果(汇编代码)告诉我一些其他的东西(第一个strcpy具有更高的性能和更少的动作)

代码语言:javascript
复制
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

这是真的吗?第一个strcpy有更多的性能(性能=更少的动作和更快)?

EN

回答 2

Stack Overflow用户

发布于 2019-08-02 19:38:38

不要紧。两者都可能比Standard库中的strcpy慢。如果你不自己实现strcpy,那么这个GCC将会做很好的内联代码。

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

票数 5
EN

Stack Overflow用户

发布于 2019-08-02 20:24:21

第二个摘录是invalid for copying a string。您在指针为64位的平台上使用32位unsigned int。因此,编译器需要非常小心地使用,以便在索引中使用32位模算术。如果您按照应该的方式将i更改为size_t,那么编译器就可以消除零扩展和LEA

在任何情况下,您的版本总是比编译器版本慢-因为在编译器中,strcpy是一个内部函数-编译器可以知道用memcpy甚至替换它,只需将单个字符加载到寄存器中,而不是无意地将一些字节从内存的一部分复制到另一部分。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57325624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档