第7回 C言語におけるGCCの拡張機能(2)

岸 哲夫

 今回は,前回に引き続き,GNU Cで使用できる拡張機能について説明と検証を行う.各拡張機能は,どれも便利に使用できるというものではなく,可読性や可搬性をよく考えたうえで使う必要がある.本稿では,拡張機能によってもたらされる便利さと,可読性や可搬性などの点からの危険性を考慮し,それぞれの機能に対して考察する. (編集部)

space

 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は標準ライブラリではありませんが,この関数はスタック領域に比較的高速に領域を確保し,確保した関数を抜けたら解放します.

 可変長自動配列もスタック領域に領域を確保し,スコープの有効範囲を抜けたら解放します.

 なお,可変長自動配列は,関数への引き数として使うことができます.


NEW記事内インデックス    連載インデックスはこちら   Interfaceのトップ
◆可変長自動配列
可変個数の引き数を受け取ることができるマクロ /左辺値ではない配列の添字が存在/voidポインタと関数へのポインタの算術演算/非定数による初期化/生成関数式/配列の初期化について
case文で範囲指定を使用する/共用体へのキャスト
関数属性の宣言

Copyright 2003 岸 哲夫

Copyright 1997-2017 CQ Publishing Co.,Ltd.