理论上两种方法中哪一种更快,为什么? (指向字符串的指针必须是常量.)
目的地[计数]和*目的地之间的确切区别是什么?每次通话时目的地[计数]是否从0变为计数? *目的地每次通话只加1吗?
char *const string = "Hello world!"; char *destination = malloc(strlen(string) + 1); int count = 0; while(string[count] != '\0') { destination[count] = string[count]; count++; } char *const string = "Hello world!"; char *destination = malloc(strlen(string) + 1); char *ptr = string; while(*ptr != '\0') { *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缓存保持两个循环都很好,目标内存未缓存,因此差异没有实际意义.祝你好好测量两者之间的差异.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。