birisinin yapabileceği endianlığı bilmenize gerek olmadığını düşünseniz bile. Birinin neden buna ihtiyacı olmadığını açıklamaya gerek yok çünkü bağlamı bilmiyor olabilirsiniz. Soru "endianlığı bilmem gerekiyor mu" değil, "büyük ya da küçük endian mı?" Lütfen konuya konsantre olun!
Tekerleği yeniden icat etmez ve Apple'ın bunun için sağladığı makrolara güvenirsek, muhtemelen en iyi uygulama olduğunu söylemiştik. Bunun nedeni, bu makroları optimize etmek için oldukça zaman harcadıkları ve simülatör, Mac, iPhone ve tüm işletim sistemleri ve donanımlarında iyi çalıştığından emin olmalarıdır.
Çağırdığınızda neler olduğunu kazarsanız CFSwapInt16BigToHost
, bu makroların derleyici optimizasyonunun yardımıyla alabileceğiniz en iyi makine kodunu ürettiğini gösteren yorumları görebilirsiniz:
OS_INLINE
uint16_t
_OSSwapInt16(
uint16_t data
)
{
/* Reduces to 'rev16' with clang */
return (uint16_t)(data << 8 | data >> 8);
}
OS_INLINE
uint32_t
_OSSwapInt32(
uint32_t data
)
{
#if defined(__llvm__)
data = __builtin_bswap32(data);
#else
/* This actually generates the best code */
data = (((data ^ (data >> 16 | (data << 16))) & 0xFF00FFFF) >> 8) ^ (data >> 8 | data << 24);
#endif
return data;
}