[1331]
constとstatic
げんた
▼みくさん
>推測ですが、constだけだとユーザ見えがconstなだけで関数内に
>入ったときにデータのコピー(作成)が発生しているんではない
>でしょうか。static const だと発生しないみたい。
えーと,staticとconstは独立な概念ですよね.
関数内constが悪いのではなくて,static無し配列が悪いと解釈するべきだと思います.
>int count(){
> static int a = 0;
> return a;
>}
という関数で,aをstatic int, const int, const static intと変更してアセンブラ出力を調べてみました.
Borland C++を使って速度で最適化をかけた結果は以下の通りです.(長いのでコメントを削除して抜粋しています)
▼static
_DATA segment dword public use32 'DATA'
align 4
$ikofbaia label dword
dd 0
_DATA ends
_TEXT segment dword public use32 'CODE'
@count$qv segment virtual
@@count$qv proc near
?live16385@0:
push ebp
mov ebp,esp
mov eax,dword ptr [$ikofbaia]
pop ebp
ret
@@count$qv endp
@count$qv ends
_TEXT ends
* データ領域にメモリを確保してそこを参照している.
▼const
_DATA segment dword public use32 'DATA'
_DATA ends
DGROUP group _BSS,_DATA
_TEXT segment dword public use32 'CODE'
@count$qv segment virtual
@@count$qv proc near
?live16385@0:
push ebp
mov ebp,esp
xor eax,eax
pop ebp
ret
@@count$qv endp
@count$qv ends
_TEXT ends
* 定数と同様に扱われている.スタック上に領域は確保されない.
▼const static
_DATA segment dword public use32 'DATA'
align 4
$aoofbaia label dword
dd 0
_DATA ends
_TEXT segment dword public use32 'CODE'
@count$qv segment virtual
@@count$qv proc near
push ebp
mov ebp,esp
xor eax,eax
pop ebp
ret
@@count$qv endp
@count$qv ends
_TEXT ends
* 定数と同様に扱われているが,メモリ領域も確保されている.(ちょっとタコ)
以上の結果から定数のconstは使っても問題ありません.
> 短いdefine名なので誤作動防止のためundefしてます。
というのはスコープの概念がある変数で
const char urF = 1;
と記述した方が,undefを使わなくても良い分スマートではないでしょうか.