Код: Выделить всё
#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;
}
Код: Выделить всё
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 отличается и почему нет Цикл в сумме 1 ?
Я ожидал sum1 и sum2 и sum3 иметь тот же код с циклом (например, clang (https:/ /godbolt.org/#…)).
Подробнее здесь: https://stackoverflow.com/questions/794 ... i-and-s-ai
Мобильная версия