雑記
こんなの、常識??
最終更新:
匿名ユーザー
-
view
こんなの、常識??
割とキャリアもあったりする人でも意外なことを知らなかったりすることがある。
割とキャリアもあったりする人でも意外なことを知らなかったりすることがある。
C言語におけるオート変数(ローカル変数)は、ほとんどの処理系においてはスタック領域に確保される(というより、スタック領域の一部の領域をその変数として使う)。
それを知らなくても、まあローカル変数が関数を抜けたところで使えなくなるのは常識だと思う。
それを知らなくても、まあローカル変数が関数を抜けたところで使えなくなるのは常識だと思う。
何が言いたいかというと、未完了復帰のAPIに、結果格納先としてオート変数のポインタを渡すということをする人が結構いるのだ。また、オート変数で馬鹿でかいワーク領域をとったりする人も。
オート変数の領域はは関数を抜けて、別の関数にエントリした時点で次の関数の別のオート変数に割り当てられる。したがって、意図しないタイミングで別のタスクによって変数の中身が書き換えられるということがおこる。
また、(Windoesアプリなんかだったら問題ないかもしれないが)オート変数で馬鹿でかい領域を確保しようとしたらすぐにスタックオーバーフローで例外が発生することになる。
また、(Windoesアプリなんかだったら問題ないかもしれないが)オート変数で馬鹿でかい領域を確保しようとしたらすぐにスタックオーバーフローで例外が発生することになる。
このあたりは、ちょっとでもアセンブラやるなりC言語のメモリの使い方を知っているならば常識だと思うのだけれど。
C言語の文法の知識を持っていても、高級言語(C言語も一応高級言語だが、この場合はVBとか)の感覚で扱っているからなのか?腑に落ちない。。
C言語の文法の知識を持っていても、高級言語(C言語も一応高級言語だが、この場合はVBとか)の感覚で扱っているからなのか?腑に落ちない。。
無駄なコードを書く人も多い。あんまりカリカリにチューニングしすぎても可読性を損なうけど、明らかに無駄なことはやめて欲しい。
例えばループ内で重い計算させたり。そこでしかできないならしかたないけど、そうでないならループの外に出さないと下手したら何十回何百回とそのパスを通ることになる。
例えばループ内で重い計算させたり。そこでしかできないならしかたないけど、そうでないならループの外に出さないと下手したら何十回何百回とそのパスを通ることになる。
プログラマの皆さん、こんなのは常識ですよね??