Какие предположения могут сделать компиляторы C ++ о указателях, которые сравнивают равные?C++

Программы на C++. Форум разработчиков
Anonymous
Какие предположения могут сделать компиляторы C ++ о указателях, которые сравнивают равные?

Сообщение Anonymous »

Я заинтересован в том, какие предположения компиляторы C ++ могут сделать о указателях, которые не сравнивают равные. В частности, в следующих ситуациях: < /p>

Одна и та же физическая страница отображается на нескольких виртуальных адресах. Адреса < /h2>
В первом случае (на одной и той же странице отображается по нескольким адресам), рассмотрите следующую программу.

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

int test(int* p, int* q) {
if (p != q) {
auto t = *q;
*p = 1;
return t;
} else {
*p = 1;
return *q;
}
}
Поскольку p и q оба являются указателями на один и тот же (нелетучий) тип, который не сравнится равным, это может быть поднято для C ++, чтобы предположить, что запись в p может быть поднят из условной и оптимизированной программы на:
int test(int* p, int* q) {
*p = 1;
return *q;
}

Однако, если p и q являются указателями на различные виртуальные адреса, которые поддерживаются одной и той же физической страницей, эта оптимизация больше не является законной. Есть ли в C ++ что -то, что сделало бы такую ​​программу настройки UB? Например, адрес 0x8000 может быть сопоставлен с другой страницей на каждом ядре, чтобы каждое ядро ​​могло получить доступ к локальному состоянию потока без необходимости использовать регистр. В этом случае эти указатели явно не должны быть распределены между различными ядрами, например, Поместив их на кучу, но C ++ говорит что -нибудь об этом? Два указателя будут сравнивать равные (если они сравнивались), но они относятся к различным объектам (что, по -видимому, запрещено стандартом).


Подробнее здесь: https://stackoverflow.com/questions/796 ... pare-equal

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