Псевдоним указателя в C++ [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Псевдоним указателя в C++ [дубликат]

Сообщение Anonymous »

Для справки: я пытаюсь понять примеры в этой статье:
Радости и опасности псевдонимов C и C++, часть 1:
Подведено здесь:

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

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
}
В статье утверждается, что возврат foo можно свернуть:

Потому что и b объявлены указателями на несовместимые типы, а поскольку C и C++ требуют, чтобы к сохраненному значению объектов обращались только через lvalue совместимого типа, сохранение в *b не может повлиять на значение *a кэшируется в переменной t, которая обычно является регистром. Следовательно, операнды в выражении вычитания должны быть равны, а результат должен быть нулевым.

Но я не понимаю, почему в бар. Какая последовательность кода/событий сделает свертывание недействительным?
Изменить: я думаю, что здесь мне не хватает чего-то более фундаментального. Я начинаю с предположения одного из следующих:
  • a и b занимают перекрывающуюся память (например, через reinterpret_cast), поэтому «строгий псевдоним» нарушается, и мы находимся на территории UB из-за оптимизации компиляторов
  • a и b имеют непересекающиеся представления в памяти, поэтому оптимизация с учетом типов ( например, можно применить свертывание оператора return)
Мое замешательство связано с непониманием, почему foo и bar различаются в либо случай. Почему приведение char* изменило это?
Редактировать (2): не дубликат псевдонимов с char *, unsigned char * и подписанным char *
Первый касается того, что считается строгим псевдонимом, а этот вопрос касается последствий и как они выводятся

Подробнее здесь: https://stackoverflow.com/questions/791 ... asing-in-c
Ответить

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

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

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

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

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