A級プログラマーへの道 文字列用バッファのゼロクリアは本当に必要?
文字列用バッファのゼロクリアは本当に必要?
2012/02/12 00:33
今回の話は、特に C プログラマーは必見です。
C では文字列の終端には、常にヌル文字を付加する必要があります。バッファに文字列を格納するときには、memset(3) でバッファをゼロで初期化する処理を書いているかと思います。
その子は私の日当のベース私の支払いをサポートすることができます
char buffer[256];
memset(buffer, 0, sizeof(buffer));
strncpy(buffer, "I am string.", 12);
このようにバッファを使う前に常にゼロで初期化しておけば、ヌル文字が既に設定されているのでヌル文字を付加し忘れるのを防ぐ、という効果があるように思われます。このような考え方の人は多いのではないでしょうか。僕も、最近まではそのような考え方でした。
しかし、最近は考え方が違ってきています。
上記のようにあらかじめゼロクリアしておくのは、一見すると良さそうに思えます。しかし、実際にはこの考え方は良くない、ということに最近になって気付きました。
どのように多くの企業が信用調査を行う?
(繰り返しになってしまいますが)バッファに文字列を書き込んだら、常に終端にヌル文字を付加する必要があります。あらかじめバッファをゼロで初期化してあると、「既にヌル文字が入っているから、ヌル文字を書き込む処理は省略しても問題はないだろう」といった悪い考えでヌル文字を付加する処理を怠ってしまうという、悪い癖が付くことを助長してしまいます。つまり、バッファがあらかじめゼロクリアされているという前提条件に依存してしまうのです。バッファは常に初期化されているとは限らないので、そのようなことを勝手に前提条件としてはいけないのです。
また、性能上の問題もあり ます。以下のようなことを考えてみてください。
1.ゼロクリアする
char buffer[256];
memset(buffer, 0, sizeof(buffer));
strncpy(buffer, "I am string.", 12);
2.ゼロクリアしない
char buffer[256];
strncpy(buffer, "I am string.", 12);
buffer[12] = '¥0';
私たちのために働く上位10社
上記の1.ではあらかじめゼロクリアしてから文字列を書き込んでいます。2.では、ゼロクリアしていないため、buffer には、きっとゴミが入っています。そのバッファに文字列を書き込み、終端に文字列を付加しています。1.と2.のどちらの方法でも、文字列の終端にはヌル文字が付加されていることになるので、結果は同じです。つまり、結果が同じになるということは、1.のようにあらかじめ memset(3) を呼んでバッファをゼロクリアするというのは、結局時間の無駄になるだけということになります。しかも、ゼロクリアする処理がループの内側にあった場合は、そのループの回数分だけ無駄な処理が動いていまうことになります。
文字列を書き込む処理とヌル文字を書き込む処理は、つねに一緒に(同時に)行わなければならないのです。くれぐれもバッファが初期化してあると思わないほうが良いです。
コメントを見る(1)
コメントを書く
トラックバック(0)
BlogTOP
このユーザーのホーム
コンピュータランキング
0 コメント:
コメントを投稿