Big endian - sprawdzanie koleności bajtów w czasie kompilacji

0

constexpr bool isBE() {
    uint16_t x = 1;

    return reinterpret_cast<uint8_t*>(&x)[0] == 0;
}

Czy powyższy kod gwarantuje poprawne sprawdzenie czy mam do czynienia z kolejnością bigendian ? Czy to jest wydajna metoda czasu kompilacji, lepsza od wykorzystania unii ? Jakie ma wady ?

7

C++20 ma gotowca https://en.cppreference.com/w/cpp/types/endian

Podczas ewaluacji constexpr w czasie kompilacji, jeśli kompilator wykryje Undefine Behavior to zawsze zgłosi błąd.
Ergo jeśli ci się to kompiluje to musi działać.

1

tu masz wersje z symbolami preprocesora:
https://stackoverflow.com/a/58642785

Z ww watku wynika ze w C++ compile time moze byc trudny do osiagniecia w tym wypadku.

0

@GordonGecko: constexpr to tylko wskazówka dla kompilatora, że funkcja może wykonać się w czasie kompilacji. W twoim przypadku kompilator to zignoruje.

0

Może takie coś:

bool isBE()
{
	static union { bool b; short s; } x {s:1};
	return x.b;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1