構造体のコピー

[戻る]
Puppy 2002/04/22(月) 13:52:24
Puppyです。こんにちは。

構造体A型の変数a, bがあります。
コピーしたいのですが

memcpy(a,b,sizeof(a));

とやって、問題はないでしょうか?
とくにエラーが出るわけではないのですが
クラスのコピーはmemcpyしちゃダメって
聞いたことがあるので不安になり質問しました。

また
memcpy(a,b,sizeof(A));
との違いってあるんでしょうか?

よろしくお願いします。m(..)mぺこり

くたくた 2002/04/22(月) 14:16:57
>memcpy(a,b,sizeof(a));
>とやって、問題はないでしょうか?
この場合、ありません。

>クラスのコピーはmemcpyしちゃダメって
>聞いたことがあるので不安になり質問しました。
この方法を使わない時が多いです。問題が発生するのを予め避ける為です。

使う時は下記のような時です。

[必要な時]
o コード量を減らしたい
o メンバ変数の数が多く、かつ些細な高速性ですら必要

[条件]
o (純粋)仮想関数が無い
o 仮想派生が無い
o 修正の可能性が無い。

>memcpy(a,b,sizeof(A));
>との違いってあるんでしょうか?
無いと思います。

ちなみに 2002/04/22(月) 14:23:10
質問が判り難いので、一部だけ答えます。
sizeof(A)…は構造体 A のサイズ
sizeof(a)…は構造体 A にある a のサイズです。
変数名が似ているので混乱しているのではないですか?

>クラスのコピーはmemcpyしちゃダメって聞いたことがある
どこで聞いたのですか?

ちなみに 2002/04/22(月) 14:25:53
すいません、質問をよく読んでいませんでした。
>memcpy(a,b,sizeof(A));
は A a,b;
としているのですよね?
では、memcpy(a,b,sizeof(b));
も同じ意味です

sara 2002/04/22(月) 14:28:29
余計なことかもしれませんが、ちょっと気になったので。

> 構造体A型の変数a, bがあります。
> コピーしたいのですが

構造体をコピーするなら、シンプルに
  a=b;
で良いのでは?

Puppy 2002/04/22(月) 14:37:08
[[解決]]
Puppyです。お返事くださった皆様、ありがとうございました。

>この方法を使わない時が多いです。問題が発生するのを予め避ける為です。

わかりました。ちょっとむずかしいので、そうします。

>構造体をコピーするなら、シンプルに
>  a=b;
>で良いのでは?

これで大丈夫なんですね。(^-^;
ありがとうございました。

ワルツ 2002/04/22(月) 16:36:34
>クラスのコピーはmemcpyしちゃダメって聞いたことがある

たしかにしないほうがいいと思います。
構造体の場合でも、ポインタなどを含む場合はmemcpyなどはあまりお勧めできません。
クラスの場合も、メンバ変数にポインタなんかを含んでいる場合には危険でしょう。
(デストラクタなどで、メモリを破棄する処理していた場合など)

代入演算子やコピーコンストラクタを定義すれば問題ないでしょう。

Puppy 2002/04/22(月) 17:09:49
ワルツさん お返事ありがとうございます。

>>クラスのコピーはmemcpyしちゃダメって聞いたことがある
>たしかにしないほうがいいと思います。

いろいろわからないことが多いので、とりあえずしないようにします。
もっと、もっと勉強しまーす。(*^-^*)

アドバイスありがとうございました。m(..)mぺこり

古いスレッドには追加発言できません。