Как компиляторы используют строгое правило псевдонимов для оптимизации [дубликат]C++

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

Сообщение 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
}
С комментарием:

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

Но во второй части мы видим аналогичный пример:< /p>

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

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
}
где свертывание невозможно:

В этом случае компилятор не может свернуть возвращаемое выражение потому что функция будет действительна, если она будет вызвана с b, равным a. Однако использование ограничения при объявлении указателей a и b сделает вызов f с перекрывающимися объектами недействительным. Это снова предоставит возможность оптимизации.

Я понимаю, что беззнаковый символ * можно использовать для псевдонимов так же, как и char * может. Но насколько я понимаю, a и b уже сигнализируют, что они не будут использовать псевдонимы в обеих сигнатурах, поскольку одна из них — int *, а другая — длинная * .
Моя мысленная модель заключается в том, что типы аргументов функции подчиняются строгим правилам псевдонимов, поэтому в любом случае...
  • и b занимают перекрывающуюся память (например, через reinterpret_cast), и мы находимся на территории UB
  • и b имеют непересекающиеся представления в памяти
...оптимизация с учетом типов (например, свертывание оператора return) еще можно применить. Я предполагаю, что это в равной степени применимо к foo и bar.
Почему использование каламбура внутри bar изменить, может ли компилятор свернуть выражение *a - t?

Подробнее здесь: https://stackoverflow.com/questions/791 ... imizations
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Используют ли компиляторы неопределенную последовательность аргументов функции?
    Гость » » в форуме C++
    0 Ответы
    24 Просмотры
    Последнее сообщение Гость
  • Какие компиляторы C/C++ предприятия используют в Linux?
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Какие алгоритмы используют популярные компиляторы C++ для std::sort и std::stable_sort?
    Anonymous » » в форуме C++
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Правило цены каталога Magento и правило корзины — количество равно или больше 1
    Гость » » в форуме Php
    0 Ответы
    145 Просмотры
    Последнее сообщение Гость
  • Можно ли использовать значение одной из переменных оптимизации во время оптимизации в операторе IF? [закрыто]
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous

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