Вслед за определенной проблемой, самоответом и комментариями к нему, я хотел бы понять, является ли это надлежащее решение, обходное решение/взлом или просто неправильно.
А именно, я переписал код:
T x = ...;
if (*reinterpret_cast (&x) == 0)
...
Как:
T x = ...;
if (*reinterpret_cast (&x) == 0)
...
с a volatile
спецификатор к указателю.
Позвольте нам просто принять ту обработку T
как int
в моей ситуации имеет смысл. Делает этот доступ через a volatile
ссылка решает проблему искажения указателя?
Для ссылки, от спецификации:
[Примечание: энергозависимый подсказка к реализации для предотвращения агрессивной оптимизации, включающей объект, потому что значение объекта могло бы быть изменено средствами, необнаруживаемыми реализацией. См. 1.9 для подробной семантики. В целом, семантика энергозависимых предназначаются, чтобы быть тем же в C++, как они находятся в C. — заканчивают примечание]
Править:
Вышеупомянутый код действительно решал мою проблему, по крайней мере, на GCC 4.5.
Volatile не может помочь вам избежать неопределенного поведения здесь. Так что, если это сработает для вас с GCC, это удача.
Предположим, T - POD. Тогда правильный способ сделать это
T x = …;
int i;
memcpy(&i,&x,sizeof i);
if (i==0)
…
Вот! Нет проблем со строгим алиасингом и с выравниванием памяти. GCC даже обрабатывает memcpy как внутреннюю функцию (в этом случае вызов функции не вставляется).