如何查看编译器生成的代码

时间:2010-04-02 11:02:07

标签: c++ testing compiler-construction

来自TC ++ PL Bjarne的一个人(ch.5,e.8)中的人要求做以下事项:
  '“运行一些测试,看看你的编译器是否真的使用指针生成等效的迭代代码,并使用索引进行迭代。如果可以请求不同程度的优化,请查看是否以及如何影响生成代码的质量”'

任何想法如何吃它和什么? 谢谢你的建议。

2 个答案:

答案 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