Gamasutra - Data Alignment, Part 1
データのアライメントについての記事。
このアライメントって聞くと昔ビットマップファイルを扱うときに苦労したことを思い出す。そのころはアライメントのことを全く知らなくてデータが正しく取得できなくて非常に悩んだことがあった。
たとえば次のようなコード。
typedef struct tagBITMAPFILEHEADER { unsigned short bfType; unsigned long bfSize; unsigned short bfReserved1; unsigned short bfReserved2; unsigned long bfOffBits; } BITMAPFILEHEADER; int getSize(char* pBuff) { // pBuffはBMPファイルをロードしたアドレスへのポインタ BITMAPFILEHEADER* pFileHeader; int size; pFileHeader = (BITMAPFILEHEADER*)pBuff; size = pFileHeader->bfSize; return size; // 正しく取得できない }
まず、ビットマップファイルをメモリ上に読み込んでおき、そのアドレスをビットマップのヘッダの構造体としてキャストしてアクセスしようとした。もちろんアライメントがあるのでこれでは正しく情報を取得できない。場合によってはアクセスしたとたんにプログラムが落ちてしまうことも。アライメントのことを知らなかったのでそのときはさっぱり原因が分からなかった。
そういえば、alignmentってカタカナで書くと、アライメント、アラインメントのどっちだろう。私はアライメントって言っているし書くことも多いかな。