Почему GCC генерирует различный код для s-> a [i] и *(s-> a+i)?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему GCC генерирует различный код для s-> a [i] и *(s-> a+i)?

Сообщение Anonymous »

Я составляю это с GCC -O1 :

Код: Выделить всё

#include 

struct mystruct{
uint32_t arr[1];
uint32_t something_after_arr;
};

uint32_t sum1(const struct mystruct *s,uintptr_t n){
uint32_t result=0;
for(uintptr_t i=0;iarr[i];
return result;
}

uint32_t sum2(const struct mystruct *s,uintptr_t n){
uint32_t result=0;
for(uintptr_t i=0;iarr];
return result;
}

uint32_t sum3(const struct mystruct *s,uintptr_t n){
uint32_t result=0;
for(uintptr_t i=0;iarr+i);
return result;
}
Compiler (https://godbolt.org/#…) сгенерировал эту сборку x86_64 (Удаленные директивы ассемблера):

Код: Выделить всё

sum1:
mov     eax, 0
test    rsi, rsi
je      .L1
mov     eax, DWORD PTR [rdi]
.L1:
ret
sum2:
mov     eax, 0
test    rsi, rsi
je      .L4
mov     eax, DWORD PTR [rdi]
.L4:
ret
sum3:
test    rsi, rsi
je      .L10
mov     eax, 0
mov     edx, 0
.L9:
add     edx, DWORD PTR [rdi+rax*4]
add     rax, 1
cmp     rsi, rax
jne     .L9
.L7:
mov     eax, edx
ret
.L10:
mov     edx, 0
jmp     .L7
только sum3 имеет отсталые прыжки. sum1 и sum2 только имеет только прямой прыжок (что означает отсутствие цикла).
Почему sum3 и sum1 отличается и почему нет Цикл в сумме 1 ?
Я ожидал sum1 и sum2 и sum3 иметь тот же код с циклом (например, clang (https:/ /godbolt.org/#…)).

Подробнее здесь: https://stackoverflow.com/questions/794 ... i-and-s-ai
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»