Okawa Yusuke
Okawa Yusuke

うんち

About Me

高専ロボコンに制御班として参加していました。プログラミング全般が好きで、主に低レイヤ系(CPU, OS, コンパイラ等)に興味があります。最近は Web 系もやってます。

興味・関心
  • クラス設計・ライブラリ設計
  • C++ コンパイル時処理
  • コンピューターアーキテクチャ
  • 散歩🚴
Blog
シリアライザを作る

シリアライザを作る

シリアライザを作った際のメモです。 シリアライザとは、構造体等のオブジェクトをバイト列に変換する機能です。通信関係のライブラリを作る際に必要になったため自作しました。 実装する際には、環境の違いによって変換後のバイト列の順序やサイズが異なる可能性があるためなかなか大変です。オブジェクトをバイト列に変換した際、CPU のエンディアンや ABI、コンパイラの仕様によって、データの配置やパディングの有無が変わることがあります。そのためこれらを完全に理解し、環境差を吸収する実装をしないといけないです:D 実装時に気をつける環境の違いによる影響: エンディアンが異なる点 浮動小数点型のサイズが異なる点 構造体のパディングサイズが異なる点 実装したこと: メンバ変数を列挙する黒魔術(パディングによるサイズの違いの対策) シリアライズ後のサイズをコンパイル時に算出する エンディアン変換 浮動小数点型のサイズが異なる問題の対策 エンディアン オブジェクトをメモリに配置する際のバイト列の並び順のことです。主にビッグエンディアンとリトルエンディアンの 2 種類があります。 ビッグエンディアンは上位バイトから下位バイトに向かって配置されます。インターネッツの世界はこれです。イメージ: mem[offset + 0] = obj[0] mem[offset + 1] = obj[1] mem[offset + 2] = obj[2] リトルエンディアンは下位バイトから上位バイトに向かって配置されます。最初に知った時は驚きました。一般的に普及している CPU はリトルエンディアンです。イメージ:

Product