RedHat Linuxの8.0がリリースされました.TurboLinuxも同じく8.0がリリースされました.他のディストリビュータも次々と新バージョンを出すことでしょう.
また,GCCの最新バージョンが3.2になり,STLの実装もかなり充実してきました.STLについては,C++言語の回で詳細に説明する予定なので,それまでお待ちください.
今回は,前回に続けてGNU Cの拡張機能について説明と検証を行います.
前回にも説明した複素数の取り扱いや長さが0の配列などについては,この連載の第3回(2002年10月号)で少し触れた「ISO/IEC 9899:1999-Programming Language C」(略称:C99)規格に含まれています.この規格については,拡張機能を説明した後に回を改めて説明します.
● 可変長自動配列
GNU Cでは可変長自動配列を宣言し,使うことができます.可変長自動配列の宣言と単純な自動配列との宣言の違いは,指定される長さが定数式ではないことです.記憶域は,配列が宣言されたところで割り当てられ,その宣言を含む構文が終了したところで解放されます.リスト1〜リスト4に例を示します.
例はいささか実用性に欠けるソースですが,このような可変長配列が利用できます.生成されたアセンブラのAllocTblを見てください.可変長自動配列を実現させるためのコードが展開されています.
また,指定される配列の長さが定数でない場合でも,実行前に決定できる数値であれば最適化されます(リスト5〜リスト7).
リスト7を見るとわかるように,最適化によって可変長自動配列が最適化されて通常の配列に解釈されました.GCCの標準機能を使って同等の機能を実装するにはallocaを使うのが一般的だと思います.
通常のシステムでは,mallocを使って動的に領域を確保すると,その領域はヒープ領域に取られます.また,この領域を解放することを忘れると,システムに悪影響を及ぼします.allocaは標準ライブラリではありませんが,この関数はスタック領域に比較的高速に領域を確保し,確保した関数を抜けたら解放します.
可変長自動配列もスタック領域に領域を確保し,スコープの有効範囲を抜けたら解放します.
なお,可変長自動配列は,関数への引き数として使うことができます.
|