Aliasing estrito de ponteiro: o acesso através de um ponteiro 'volátil' / referência é uma solução?
Na esteira deum problema específico, uma resposta automática e comentários, gostaria de entender se é uma solução adequada, solução alternativa / hack ou simplesmente errada.
Reescrevi especificamente o código:
T x = ...;
if (*reinterpret_cast <int*> (&x) == 0)
...
Como:
T x = ...;
if (*reinterpret_cast <volatile int*> (&x) == 0)
...
com umvolatile
qualificador para o ponteiro.
Vamos apenas assumir que o tratamentoT
Comoint
na minha situação faz sentido. Isso acessa através de umvolatile
referência resolver o problema de aliasing de ponteiro?
Para uma referência, da especificação:
[Nota: volátil é uma dica para a implementação para evitar otimização agressiva envolvendo o objeto, porque o valor do objeto pode ser alterado por meios indetectáveis por uma implementação. Veja 1.9 para semântica detalhada. Em geral, a semântica de volátil deve ser a mesma em C ++ e em C. - nota final]
EDITAR:
O código acima resolveu meu problema pelo menos no GCC 4.5.