アクマくんにお願い:2001年01月下旬

Last-modified: Fri, 26 Jan 2001 14:58:59 JST

[static,style:furuta,jconv:jcode,cache:on]
powered by tds-Tomsoft Diary System 1.01-beta0


[トップ(一覧)] [最新版] [<<前月] [今月] [翌月>>]

2001年01月26日(金)

static versus auto

その「static はプログラム終了するまでずっとメモリに残りつづけるから 綺麗とは言えない」 という主張は根本的に誤解してますよ。「auto の方もプログラム終了するまで、 (本質的に同等以上のデータが)メモリに残り続けます」

auto 変数というのはスタック上に確保されます。 この場合、毎度関数呼出し毎に確保が行われます。 確保された時、配列の中はゴミです。 なので、この場合は(GORRYさんの指摘の通り)毎度初期化されます。 じゃあ、配列の初期化っていうのはどうやってやるかと言うと、 それはコンパイラの実装毎に違いますけど、本質的には二通りしかありません。

後者は、(0で初期化するような、さらに最適化できるケースを除いて) 即値として機械語中に展開されるので、 結局 static に確保した以上のデータがコード中に存在するわけです。 どちらにしても、static に配列を確保した程度以上のデータは、ずっと メモリ上に残るのです。static にすれば、関数呼出し毎の初期化の無駄なコピーは 発生しませんから、この場合は 100% static にするケースです。 auto にするメリットは全く存在しません。 (ところで、昔のCだと auto 配列の初期化自体ができませんでしたので、 auto の方のコードは気持ち悪くて仕方がありません。 何でこんな無駄なものを入れたんでしょうね...)

じゃあ、 GORRYさんのコードならOKかと言うと、これもまだいまいちな気がします。 どちらかと言うと、実装よりも仕様の問題だけれども、この場合 caller 側のバッファに一々 strcpy() してやる必要があるのかどうか。 必要なければ、バッファにコピーせず、ポインタをそのまま返すようにすればいいし、 strcpy() してやりたいなら、バッファオーバーフローの検査ぐらいはしたいです。 (バッファ長を渡してもらうようにする) まあ、GORRYさんはわかってて、繁雑になるので省略したのだとは思いますが。 さらに、仕様によっては month の範囲チェックぐらいしないと安心できません。:-)


[トップ(一覧)] [最新版] [<<前月] [今月] [翌月>>]

このページは、

Copyright(C) 1999,2000 Atsushi Furuta <furuta@bsdclub.org> All rights reserved.