開発メモ(覚書き)
- 32バイト境界
devkitPPCでは、多くの変数(構造体やメモリブロック)を32バイト境界に載せないといけません。
境界を揃える方法は3つあります。- ATTRIBUTE_ALIGNマクロを使用する(C/C++の変数宣言時に有効)。
- memalign関数でメモリブロックを確保する(C/C++のメモリブロック宣言時に有効)。
- 「.align 5」を使用(GNU AS(アセンブラ)にて有効)
- ATTRIBUTE_ALIGNマクロ
こんな感じに使います。
TDImage ATTRIBUTE_ALIGN(32) tdimg;
- memalignについて
激しくマイナーですが、libcにはmemalignという関数があります。
これは、第一引数boundaryの倍数に相当するメモリブロックを第二引数size(単位:バイト)分確保する関数です。
まず、この関数の説明で混乱します。バウンダリの意識が薄いと説明を読んでもよくわかりません。
しかも、引数の値が入れ替わっていても希望のサイズのメモリブロックが確保できてしまいます。
本家のサンプルさえこれを間違えています。
正しい使用方法は以下のとおりです。
32バイト区切りで、300バイト以上のメモリブロックを確保します。
32の倍数で300以上の近似値は320バイトなので、320バイトのバッファが確保されます。
p = (void*)memalign( 32, 300 );
- memalignの落とし穴
memalignの処理で重要なことがあります。
それは、バウンダリをあわせることです。
先の説明でもあるように、この関数は引数を間違える人が多いです。
引数を間違えると、32バイト境界にバウンダリが合わない可能性があります。
浅い経験上、これが問題になったことはありませんが、エンバグの元になることはたしかです。
参考リンク