Обобщено здесь:
Код: Выделить всё
int foo(int *a, long *b)
{
int t = *a;
*b = 0; // cannot change *a
return *a - t; // can be folded to zero
}
int bar(int *a, long *b)
{
int t = *a;
for (int i = 0; i != sizeof *b; ++i)
((unsigned char*)b)[i] = 0;
return *a - t; // must not be folded
}
Потому что a и b объявлены указателями на несовместимые типы , а поскольку C и C++ требуют, чтобы объекты имели доступ к сохраненному значению только через lvalue совместимого типа, сохранение в *b не может повлиять на значение *a, кэшированное в переменной t
...но я не понимаю, почему в баре все по-другому. Какая последовательность кода/событий сделает свертывание недействительным?
Подробнее здесь: https://stackoverflow.com/questions/791 ... asing-in-c
Мобильная версия