来自TC ++ PL Bjarne的一个人(ch.5,e.8)中的人要求做以下事项:
'“运行一些测试,看看你的编译器是否真的使用指针生成等效的迭代代码,并使用索引进行迭代。如果可以请求不同程度的优化,请查看是否以及如何影响生成代码的质量”'
任何想法如何吃它和什么? 谢谢你的建议。
答案 0 :(得分:5)
你想编写类似这样的代码:
int a[] = {1,2,3,4};
int n = 0;
for ( int i = 0; i < 4; i++ ) {
n += a[i];
}
int * p = a;
for ( int i = 0; i < 4; i++ ) {
n += *p++;
}
然后你需要用编译器选项编译它,让你的编译器发出汇编语言,然后看看它。无论是否启用了优化,这都是有益的。
答案 1 :(得分:3)
int sum_with_array_indexing(int* p, int size)
{
int s = 0;
for (int i = 0; i < size; ++i)
{
s += p[i];
}
return s;
}
int sum_with_pointer_arithmetic(int* p, int size)
{
int s = 0;
for (int i = 0; i < size; ++i)
{
s += *p++;
}
return s;
}
g++ -S -O2
会产生相同的代码:
__Z23sum_with_array_indexingPii:
LFB0:
pushl %ebp
LCFI0:
movl %esp, %ebp
LCFI1:
pushl %ebx
LCFI2:
movl 8(%ebp), %ebx
movl 12(%ebp), %ecx
testl %ecx, %ecx
jle L8
xorl %edx, %edx
xorl %eax, %eax
.p2align 2,,3
L4:
addl (%ebx,%edx,4), %eax
incl %edx
cmpl %ecx, %edx
jne L4
L3:
popl %ebx
leave
ret
L8:
xorl %eax, %eax
jmp L3
和
__Z27sum_with_pointer_arithmeticPii:
LFB1:
pushl %ebp
LCFI3:
movl %esp, %ebp
LCFI4:
pushl %ebx
LCFI5:
movl 8(%ebp), %ebx
movl 12(%ebp), %ecx
testl %ecx, %ecx
jle L15
xorl %eax, %eax
xorl %edx, %edx
.p2align 2,,3
L12:
addl (%ebx,%edx,4), %eax
incl %edx
cmpl %ecx, %edx
jne L12
L11:
popl %ebx
leave
ret
L15:
xorl %eax, %eax
jmp L11