2017/07/20

[c/c++]エンディアン変換

よく行う処理に、エンディアン変換がある。
バイトの順番を入れ替えるだけではあるが、しょっちゅう出てくると気になってくる。

機械語で何か用意されていないだろうか、ということだ。
エンディアンの変換はかなり地味な作業だが、それなりに発生するので、1命令で実行できるようになっていたりせんだろうか。
あるいは、コンパイラが組込みライブラリで用意してくれているとか。


この辺りを読むと、GCCにbuilt-inの関数がありそうだ。
c++ - Fast conversion of 16-bit big-endian to little-endian in ARM - Stack Overflow
swap - convert big endian to little endian in C [without using provided func] - Stack Overflow


一番下に、3つAPIがあった。
Using the GNU Compiler Collection (GCC): Other Builtins

  • __builtin_bswap16()
  • __builtin_bswap32()
  • __builtin_bswap64()

アンダーバーが2つついているので、GCC専用というのをありありとうたっている。
ものすごく速度を要求されるようなことがあれば、こっちを使った方が良いのかもしれん。
ARM命令だったかThumb命令だったか忘れたけど、直値のビットシフトがあまり得意じゃなかった記憶があったのだが、他のなにかと間違って覚えてしまっていたのかも。


バイトの順番を入れ替える処理って、C/C++の標準ライブラリにはないし、見た目も普通に計算しているだけだから、コンパイラが最適化してうまいことやってくれるのを期待するのが難しい気がするのだ。
C11なんかで追加されているのを期待したが、Cクイックリファレンスにはなさそうだった。
やるんだったら、#pragmaなんかで「ここはエンディアン変換しています」みたいな目印を書くとか、そういう方向になるんだろうか。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。