C言語関係掲示板

過去ログ

No.64. memset とmemcpyに関する疑問


ちょっとした疑問が2点ほどあります。

例えば、(二次元)配列を0で初期化する場合、
for文などを使って配列の各要素に0を代入していくのと
memset関数を使うのとでは、どちらがよい(速い)のでしょうか。
あるいは違いがあるでしょうか?

また、構造体同士の代入の場合、
メンバ同士を代入するのと、
memcpy関数を使うのでは、どちらがよい(速い)のでしょうか。
あるいは違いがあるでしょうか?

わかりにくい質問だったら、すみません。


hazimeteさん、お久しぶりです。こちらにご質問いただくなんて嬉しいです。

> 例えば、(二次元)配列を0で初期化する場合、
> for文などを使って配列の各要素に0を代入していくのと
> memset関数を使うのとでは、どちらがよい(速い)のでしょうか。
> あるいは違いがあるでしょうか?

手持ちの「ANSI C言語辞典」平林雅英著 技術評論社によると、
memsetの内部処理例は単にwhile文でバイト数分のエリアに値を代入するに
すぎませんね。ということは、「for文などを使って配列の各要素に0を代入」
する方が、関数によるオーバヘッドが無い分速いことになりますね。
でも、美しいのはmemsetかも知れません。(好き好きですが)
あと、宣言時に初期化するのでかまわなければ、
int data[100] = {0}; のようにすると、全ての要素に{0}を設定できますよ。

> また、構造体同士の代入の場合、
> メンバ同士を代入するのと、
> memcpy関数を使うのでは、どちらがよい(速い)のでしょうか。
> あるいは違いがあるでしょうか?

memcpyも同様に、while文でバイト数分のエリアをコピーしているだけです。
あと、構造体の場合、エリアにびっしりメンバが詰まっているわけではなく、
コンパイラでバイト幅の調節をしながらメンバを格納しているので、空きエリア
も生じていますよね。ですから、やはりメンバ同士の代入の方が効率はよい
んじゃあ無いでしょうか。
ですが、構造体の場合は各々のメンバ同士を代入するよりも、構造体を一括
代入した方が簡単ですし、見た目もスッキリすると思いますよ。


ともじさん、お久しぶりです。
質問に対する回答ありがとうございました。
おかげで疑問が解決しました(レベルアップ!)。
実はちょい古めのプログラムの本を読んでいたら
memsetやmemcpyが使われていて、なぜこちらが使われているのか
気になったので質問させてもらいました。
一つのことに対して二通り以上の方法がある場合
どちらを使ったらより良いのかわからない時が結構ありますので…。
それとmemsetなども全然使ったことがない関数でしたので…。

そう言えばこちらの掲示板で質問させてもらったのははじめてですね。
いろいろとお忙しいところ、本当にありがとうございました。

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.11.15
Copyright(c) 2000-2002 TOMOJI All Rights Reserved