Converter uma estrutura em uma matriz [duplicado]
Esta pergunta já tem uma resposta aqui:
O acesso ao primeiro campo de uma estrutura através de uma conversão C viola o aliasing estrito? 1 respostaReinterpretar struct com membros do mesmo tipo que uma matriz de uma maneira compatível com o padrão [duplicado] 5 respostasEsta é uma pergunta estrita sobre alias, pois o compilador causará problemas com a ordem de otimização.
Diga que eu tenho três públicosfloat
s em umstruct XMFLOAT3
(não muito diferenteeste.) E eu quero converter para umfloat*
. Isso vai me trazer problemas de otimização?
XMFLOAT3 foo = {1.0f, 2.0f, 3.0f};
auto bar = &foo.x;
bar[2] += 5.0f;
foo.z += 5.0f;
cout << foo.z;
Suponho que isso sempre será impresso "13". Mas e esse código:
XMFLOAT3 foo = {1.0f, 2.0f, 3.0f};
auto bar = reinterpret_cast<float*>(&foo);
bar[2] += 5.0f;
foo.z += 5.0f;
cout << foo.z;
Eu acredito que isso é legal porque, de acordo comhttp://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_aliasing
T2 é um tipo agregado ou um tipo de união que mantém um dos tipos mencionados acima como um elemento ou membro não estático (incluindo, recursivamente, elementos de subagregados e membros de dados não estáticos das uniões contidas): isso torna seguro a conversão do primeiro membro de uma estrutura e de um elemento de uma união à estrutura / união que a contém.
Minha compreensão disso está correta?
Obviamente, isso se tornará uma implementação dependente da declaração deXMFLOAT3
.