char vram[width][height]; unsigned long* pixels; // longは4バイトで構成されているとします unsigned long carrier; int x, y; pixels = (unsigned long*)vram; for(y = 0; y < height; y++){ for(x = 0; x < width;){ // plot(x, y): (x, y)に描くべき色(符号なし1バイト)を返す carrier = plot(x++, y); carrier = (carrier <<8) |plot(x++, y); carrier = (carrier <<8) |plot(x++, y); carrier = (carrier <<8) |plot(x++, y); *(pixels++) = carrier; } }もちろん、あらかじめデータを4バイト(もしくは8バイト)で切りそろえておくことも必要です。
pixels = (unsigned long*)vram; pixels--; for(y = 0; y < height; y++){ for(x = 0; x < width;){ carrierに値をセット *(++pixels) = carrier; } }コンパイラによっては上のように、アドレスの計算にプレインクリメントを使ったほうが高速なコードを吐き出す場合があります。ポストインクリメントを使った場合とプレインクリメントを使った場合のアセンブラコードを比較すると次のようになります。(コンパイラはMWC/C++ 1.5を使用)
ポストインクリメントを使った場合stw r5,0(r3) addi r3,r3,4 |
プレインクリメントを使った場合stwu r5,4(r3) |
r5: 書き込む値 r3: 書き込まれるアドレス stw r5, 0(r3): r3+0のアドレスにr5をワード(4バイト)として書き込む addi r3, r3, 4: r3の値を+4してr3に書き込む stwu r5, 4(r3): r3の値を+4した後、r3のアドレスにr5をワードとして書き込む |