Problemas de aliasing podem ser evitados com variáveis const
Minha empresa usa um servidor de mensagens que envia uma mensagem para umconst char*
e o lança no tipo de mensagem.
Fiquei preocupado com isso depois de perguntaressa questão. Não estou ciente de nenhum mau comportamento no servidor de mensagens. É possível queconst
variáveis não apresentam problemas de alias?
Por exemplo, digamos que foo seja definido emMessageServer
de uma destas maneiras:
void MessageServer(const char* foo)
Ou como variável const no topo deMessageServer
: const char* foo = PopMessage();
AgoraMessageServer
é uma função enorme, mas nunca atribui nada afoo
, no entanto, em 1 pontoMessageServer
lógica defoo
vai ser convertido para o tipo de mensagem selecionado.
auto bar = reinterpret_cast<const MessageJ*>(foo);
bar
será lido apenas posteriormente, mas será usado extensivamente para a configuração do objeto.
Um problema de aliasing é possível aqui ou o fato de quefoo
só é inicializado e nunca modificado, me salva?
EDITAR:
Resposta de Jarod42 não encontra nenhum problema ao transmitir a partir de umconst char*
para umMessageJ*
, mas não tenho certeza se isso faz sentido.
Sabemos que isso é ilegal:
MessageX* foo = new MessageX;
const auto bar = reinterpret_cast<MessageJ*>(foo);
Estamos dizendo que isso de alguma forma a torna legal?
MessageX* foo = new MessageX;
const auto temp = reinterpret_cast<char*>(foo);
auto bar = reinterpret_cast<const MessageJ*>(temp);
Meu entendimento deResposta de Jarod42 é que o elenco paratemp
torna legal.
EDITAR:
Eu recebi alguns comentários em relação à serialização, alinhamento, passagem de rede e assim por diante. Não é disso que se trata esta questão.
Esta é uma pergunta sobrealiasing estrito.
O aliasing estrito é uma suposição, feita pelo compilador C (ou C ++), de que o referenciamento de ponteiros para objetos de tipos diferentes nunca se referirá ao mesmo local da memória (ou seja, alias um ao outro).
O que estou perguntando é:A inicialização de umconst
objeto, transmitindo de umchar*
, sempre será otimizado abaixo de onde esse objeto é convertido para outro tipo de objeto, para que eu esteja transmitindo dados não inicializados?