У меня есть два одинаковых цикла while, и мне любопытно, почему компилятор C ведет себя по-разному в каждом случае.
Детали: Компилятор: x86-64 gcc 8.2
Опции: -O3
void use()
{
int* ptr;
while (*ptr == 6);
}
Assembly:
use:
cmp DWORD PTR ds:0, 6
jne .L1
.L3:
jmp .L3
.L1:
ret
Как видим,Компилятор все еще генерирует бесконечный цикл.Однако, если я использую это:
void use()
{
int p;
while (p == 6);
}
Assembly:
use:
ret
Я ожидал, что они оба не сгенерируют цикл while.Я предполагаю, что для 1-й версии, поскольку мы не можем знать, на что указывает ptr, мы не можем ничего предположить о * ptr.Но можем ли мы сделать аналогичный аргумент для 2-й версии, где p - просто локальная переменная, то есть p может содержать что-нибудь?