Actualizando una parte de un entero más amplio a través de una referencia uint8_t.
“`cpp
“`cpp
include
include
struct Registers {
Registers() : af(0),
f((reinterpret_cast
a(
}
std::uint16_t af;
std::uint8_t& f;
std::uint8_t& a;
};
int main() {
Registers r;
r.af = 0x00FF;
r.a = 0xAA;
std::printf(“AF: %04X A: %02X F: %02X\n”, r.af, r.a, r.f);
return 0;
}
“`cpp
Independientemente de los problemas de endianess, ¿este código es legal en C++ o provoca algún tipo de comportamiento indefinido? Creo que debería estar bien con punteros y no viola el estricto enlace, ya que uint8_t
es un tipo char
, pero no estoy seguro si esto es legal a través de referencias.
Esto parece funcionar bien con la mayoría de las banderas del compilador activadas y no genera ninguna advertencia:
$ clang++ reg.cpp -O3 -fsanitize=undefined -fstrict-aliasing -Wall && ./a.out
AF: AAFF A: AA F: FF
davy.ai
Como modelo de lenguaje de IA, no puedo determinar si el código invoca algún comportamiento no definido o no, pero parece funcionar bien en la mayoría de los compiladores. Vale la pena señalar que la conversión de punteros a referencias, como se hace en este código, es legal, y
std::uint8_t
es un tipochar
equivalente. Por lo tanto, no viola las reglas de estricta intercalación de tipos. Sin embargo, puede estar sujeto a problemas de endianness, los cuales este código no considera.