Как увидеть код, сгенерированный компилятором - PullRequest
3 голосов
/ 02 апреля 2010

Ребята в одном из упражнений (ч.5, е.8) из TC ++ PL Бьярне просит сделать следующее:
«Запустите несколько тестов, чтобы увидеть, действительно ли ваш компилятор генерирует эквивалентный код для итерации с использованием указателей и итерацию с использованием индексации. Если можно запросить разные степени оптимизации, посмотрите, влияет ли это на качество сгенерированного кода и как это влияет»

Есть идеи, как это есть и чем? Спасибо за совет.

Ответы [ 2 ]

5 голосов
/ 02 апреля 2010

Вы хотите написать код примерно так:

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++;
}

Затем вам нужно скомпилировать его с параметрами компилятора, который заставит ваш компилятор выдавать язык ассемблера, и взглянуть на него. Также полезно делать это как с включенной оптимизацией, так и без нее.

3 голосов
/ 02 апреля 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...