加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – string [x] vs * string

发布时间:2020-12-16 04:57:30 所属栏目:百科 来源:网络整理
导读:理论上两种方法中哪一种更快,为什么? (指向字符串的指针必须是常量.) 目的地[计数]和*目的地之间的确切区别是什么?每次通话时目的地[计数]是否从0变为计数? *目的地每次通话只加1吗? char *const string = "Hello world!";char *destination = malloc(st
理论上两种方法中哪一种更快,为什么? (指向字符串的指针必须是常量.)

目的地[计数]和*目的地之间的确切区别是什么?每次通话时目的地[计数]是否从0变为计数? *目的地每次通话只加1吗?

char *const string = "Hello world!";
char *destination = malloc(strlen(string) + 1);
int count = 0;
while(string[count] != '')
{
    destination[count] = string[count];

    count++;
}

char *const string = "Hello world!";
char *destination = malloc(strlen(string) + 1);
char *ptr = string;
while(*ptr != '')
{
    *destination++ = *ptr++;
}

解决方法

我们为什么要推测?我们可以尝试并找出答案.我用gcc -O3 -g(在x86上)编译代码并反汇编结果.有比我预期的更多的变化,所以我将集中在中间的位置,我们期望两者之间的大部分差异.
第一种情况下循环的核心:
0x00000030 <foo+48>:    mov    %dl,(%edi,%esi,1)
0x00000033 <foo+51>:    movzbl 0x1(%ecx),%edx
0x00000037 <foo+55>:    inc    %eax
0x00000038 <foo+56>:    inc    %ecx
0x00000039 <foo+57>:    mov    %eax,%esi
0x0000003b <foo+59>:    test   %dl,%dl
0x0000003d <foo+61>:    jne    0x30 <foo+48>

第二种情况下循环的核心:

0x00000080 <foo2+48>:   mov    %dl,(%eax)
0x00000082 <foo2+50>:   movzbl 0x1(%ecx),%edx
0x00000086 <foo2+54>:   inc    %eax
0x00000087 <foo2+55>:   inc    %ecx
0x00000088 <foo2+56>:   test   %dl,%dl
0x0000008a <foo2+58>:   jne    0x80 <foo2+48>

在此基础上,第二个可能会快一点.但实际上,它在实践中并没有太大的区别. L1缓存保持两个循环都很好,目标内存未缓存,因此差异没有实际意义.祝你好好测量两者之间的差异.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读