2011/04/11

const値はある程度展開される

こんなコードを書いていた。

const char val[] = { 1, 2, 3, param, 4, 5 };

何かというと、配列の初期化子に変数が入っているのだ。
私のイメージとしては、初期化子はROM領域にあり、memcpy()でRAMに展開される、というものだ。
間に変数が入ることでどうなるのだろうか?

gcc -Sでコンパイルすると、全部展開されていた。
つまり、1byteずつmobvで代入されているのだ。
あらまあ。

movbが何バイトの命令かはわからないけど、1byteではあるまい。
2byteだったとしても、元のサイズの倍は必要になるのだ。
そりゃ確かに、アンロールすると高速にはなるだろうけど・・・。

かといって、変数をなくすと展開しないかというと、そうでもない。
初期化子のサイズ次第みたいだ。
-Osとかしても変わらない。

ふーん。
なんか落ち着かないが、仕方あるまい。
ARM版のgccでも同じなのかな?

0 件のコメント:

コメントを投稿

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

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