iPhone(およびiPad)はARMプロセッサで動作することを知っています。ARMプロセッサはデフォルトでリトルエンディアンです(Wikipediaページによると、iOS自体はリトルエンディアンです)。ただし、ARMプロセッサにはリトルエンディアンとビッグエンディアンを切り替える機能があると考えられます。これはどの程度可能であり、どのように機能しますか?
iPhone(およびiPad)はARMプロセッサで動作することを知っています。ARMプロセッサはデフォルトでリトルエンディアンです(Wikipediaページによると、iOS自体はリトルエンディアンです)。ただし、ARMプロセッサにはリトルエンディアンとビッグエンディアンを切り替える機能があると考えられます。これはどの程度可能であり、どのように機能しますか?
回答:
エンディアンについて誰かが知っている必要はないと考えていても。あなたが文脈を知らないかもしれないので誰かがそれを必要としない理由を説明する必要はありません。問題は、「エンディアンを知る必要があるか」ではなく、「ビッグエンディアンかリトルエンディアンか」です。だから、主題に集中してください!
とは言っても、ホイールを再発明せずに、Appleがこれを提供するマクロに依存するだけの場合は、これがベストプラクティスであろう。その理由は、彼らがこれらのマクロを最適化するためにかなりの時間を費やしており、シミュレータ、Mac、iPhone、およびすべてのOSとハードウェアでうまく機能することを確認したからです。
呼び出し時に何が起こっているかを掘り下げるとCFSwapInt16BigToHost
、これらのマクロがおそらくコンパイラの最適化の助けを借りて入手できる最高のマシンコードを生成していることを示唆するコメントが表示される場合があります。
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;
}
エンディアンネスは、エンドユーザーが実際に操作するものではありませんが、アップル製品のユーザーにとってこれが何を意味するかについて、10,000フィートの要約があります。
簡単に言えば、内部プロセッサのエンディアンは、言語の記述方向と同じです。あなたが英語のテキストの文字を見るとき、私たちは皆、左上から始め、最初に右、次に下に読むことに同意します。他の言語は右から始まり、左に読み、いくつかは左または右に移動する前に最初に読みます。
アドレスまたは数値の内部表現のビットがリトルエンディアンまたはビッグエンディアンに格納されているかどうかは、ユーザーにとって重要ではありません。実際、MacのOS Xはビッグエンディアン表現に準拠し、iOSはリトルエンディアンの順序に準拠しています。この事実は、2つのデバイスが正しく連携できないことを意味するものではありません。これが機能するのは、この表現が内部でのみ発生し、ユーザーとして公開されないためです。