Can Aliasing Problems be Avoided with const Variables
Моя компания использует сервер обмена сообщениями, который доставляет сообщение вconst char*
и затем преобразует его в тип сообщения.
Я стал беспокоиться об этом после того, как спросилэтот вопрос, Я не знаю ни о каком плохом поведении на сервере обмена сообщениями. Возможно ли, чтоconst
переменные не вызывают проблем с псевдонимами?
Например, скажем, что foo определяется вMessageServer
одним из следующих способов:
void MessageServer(const char* foo)
Или как константная переменная в верхней частиMessageServer
: const char* foo = PopMessage();
СейчасMessageServer
это огромная функция, но она никогда ничего не назначаетfoo
Однако в 1 точкеMessageServer
логикаfoo
будут быть приведенным к выбранному типу сообщения.
auto bar = reinterpret_cast<const MessageJ*>(foo);
bar
будет прочитан только впоследствии, но будет широко использоваться для настройки объекта.
Возможна ли здесь проблема с алиасами?foo
только инициализируется, и никогда не изменяется, кроме меня?
РЕДАКТИРОВАТЬ:
Jarod42 ответ не находит проблем с кастингом изconst char*
кMessageJ*
, но я не уверен, что это имеет смысл.
Мы знаем, что это незаконно:
MessageX* foo = new MessageX;
const auto bar = reinterpret_cast<MessageJ*>(foo);
Мы говорим, что это как-то делает законным?
MessageX* foo = new MessageX;
const auto temp = reinterpret_cast<char*>(foo);
auto bar = reinterpret_cast<const MessageJ*>(temp);
Мое пониманиеJarod42 ответ это актёрский составtemp
делает это законным.
РЕДАКТИРОВАТЬ:
Я получил несколько комментариев, касающихся сериализации, выравнивания, передачи по сети и так далее. Вопрос не в этом.
Это вопрос острогое наложение.
Строгий псевдоним - это предположение, сделанное компилятором C (или C ++), что разыменование указателей на объекты разных типов никогда не будет ссылаться на одну и ту же область памяти (то есть псевдоним eachother.)
Я спрашиваю:Будет ли инициализацияconst
объект, отливая изchar*
когда-нибудь оптимизировать, где этот объект приведен к объекту другого типа, так что я выполняю преобразование из неинициализированных данных?