2017-01-31 4 views
3

Верно ли, что reinterpret_cast обыкновения изменять значение указателя это бросало, даже если новый указатель является незаконной один:Правда ли, что reinterpret_cast не изменит значение указателя?

char * charbuffer = ....//charbuffer is a buffer we allocated. 

int * Ptr=reinterpret_cast< int *>(charbuffer+17);//Ptr should be illegal due to mis-aligment 

Я полагаю, даже если адрес указал на charbuffer+17 (который char * типа указателя) является незаконным для хранения значений типа int из-за неправильного выравнивания, Ptr get by reinterpret_cast по-прежнему указывает на тот же адрес памяти, что и charbuffer+17?

Обратите внимание, что мы не заботимся о содержании, на которое оно указывалось, мы просто хотим убедиться, что адрес памяти, который этот указатель представляет, совпадает с charbuffer+17.

Такое обещание очень важно для правильности и переносимости некоторых кодов, которые мы рассмотрели.

+0

Почему, на ваш взгляд, указатель был бы незаконным? Это зависит от архитектуры. На многих архитектурах вполне справедливо указывать на любое место в памяти, это может быть медленнее. –

+0

Ну, не надо, но может. – user2188453

+0

В любом случае нет причин для кастинга, чтобы изменить значение. Если это не разрешено использовать, тогда будет аппаратное исключение, прерывание или какой-либо другой способ сообщения об ошибке. Дело не в том, чтобы определить, разрешено ли это, особенно потому, что его даже никогда нельзя было получить. –

ответ

2

Согласно стандарту C++, это не безопасно:

5.2.10 переинтерпретировать отливать
[...]
[Примечание: отображение выполняется reinterpret_cast может, или может нет, создать представление, отличное от исходного. - конец примечание]

Но на практике я бы не ожидал reinterpret_cast вернуть другое значение.

+0

Это конечно открыть банку червей, но спасибо за это. – user2188453

+0

Добро пожаловать. Я думаю, что если указатель будет возвращен к исходному типу, значение будет тем же самым, но я не нашел место в стандарте. Если это было бы полезно для вас, я могу попытаться его найти. – alain

Смежные вопросы