Верно ли, что 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
.
Такое обещание очень важно для правильности и переносимости некоторых кодов, которые мы рассмотрели.
Почему, на ваш взгляд, указатель был бы незаконным? Это зависит от архитектуры. На многих архитектурах вполне справедливо указывать на любое место в памяти, это может быть медленнее. –
Ну, не надо, но может. – user2188453
В любом случае нет причин для кастинга, чтобы изменить значение. Если это не разрешено использовать, тогда будет аппаратное исключение, прерывание или какой-либо другой способ сообщения об ошибке. Дело не в том, чтобы определить, разрешено ли это, особенно потому, что его даже никогда нельзя было получить. –