Согласно http://en.cppreference.com/w/cpp/language/reinterpret_cast, Известно, что reinterpret_cast
указатель на интеграл достаточного размера и обратно дают одно и то же значение. Мне интересно, верно ли обратное по стандартам. То есть, дает ли reinterpret_cast
интеграл для типа указателя достаточного размера и обратно одно и то же значение?
Дает ли переинтерпретация_приведения интеграла к типу указателя и обратно одно и то же значение?
Ответы (2)
Нет, это не гарантируется стандартом. Цитируя все части С++ 14 (n4140) [expr.reinterpret.cast], которые касаются преобразования указателя в целое число, выделено мной:
4 Указатель может быть явно преобразован в любой целочисленный тип, достаточно большой для его хранения. Функция отображения определяется реализацией. [ Примечание. Это должно быть неудивительно для тех, кто знаком со структурой адресации базовой машины. —конец примечания ] ...
5 Значение целочисленного типа или типа перечисления может быть явно преобразовано в указатель. Указатель, преобразованный в целое число достаточного размера (если таковой существует в реализации) и обратно в тот же тип указателя, будет иметь исходное значение; сопоставления между указателями и целыми числами в остальном определяются реализацией. [ Примечание: За исключением случаев, описанных в 3.7.4.3, результатом такого преобразования не будет безопасно полученный указатель. ценность. —конец примечания ]
Таким образом, запуск с целочисленного значения и преобразование его в указатель и обратно (при условии отсутствия проблем с размером) определяется реализацией. Это означает, что вы должны проконсультироваться с документацией вашего компилятора, чтобы узнать, сохраняет ли такой цикл туда и обратно значения или нет. Таким образом, он, конечно, не портативный.
Я получаю именно эту проблему в библиотеке, экспортирующей указатели на объекты как непрозрачные идентификаторы, и теперь попытки восстановить эти указатели из внешних вызовов не работают для старых процессоров x86 (во времена Windows 98). Таким образом, хотя мы можем ожидать такого поведения, в общем случае это неверно. В 386-CPU адрес состоит из перекрывающихся указателей, поэтому адрес любой позиции памяти не уникален, и я обнаружил, что обратное преобразование не восстанавливает исходное значение.
reinterpret_cast
для выполнения преобразования. - person Lingxi   schedule 11.03.2015