1. ホーム
  2. c

[解決済み] ある構造体を別の構造体にコピーする

2022-02-15 18:18:27

質問

構造体をメンバーごとにコピーできることは知っていますが、その代わりに memcpy を構造体に適用できますか?

そうすることが望ましいのでしょうか?

私の構造体では、文字列もメンバーとして持っており、同じメンバーを持つ別の構造体にコピーする必要があります。どうすればいいのでしょうか?

どのように解決するのですか?

単純な代入によるコピーは、短く、読みやすく、抽象度が高いので、最適です。コードを読む人間に対して)「これらのビットをここからあそこにコピーしてください」と言い、読者にコピーのサイズ引数を考えさせる代わりに、単純な代入("この値をここからここにコピーする")をしているのです。サイズが正しいかどうか、迷うことはないのです。

また、構造体が大きくパディングされている場合、パディングをコピーする必要がない(パディングの位置がわかる)ので、代入によってコンパイラはより効率的なものを出力するかもしれませんが mempcy() そのため、コピーするように指示されたバイト数を常に正確にコピーします。

文字列が実際の配列である場合、すなわち。

struct {
  char string[32];
  size_t len;
} a, b;

strcpy(a.string, "hello");
a.len = strlen(a.string);

そうすると、やはりプレーンな代入が使えるようになります。

b = a;

完全なコピーを取得するため。しかし、このようにモデル化された可変長データでは、配列全体が常にコピーされるため、これは最も効率的なコピー方法ではありません。

ただし、ヒープで確保されたメモリへのポインタを含む構造体をコピーするのは、少し危険です。 エイリアス ポインタの所有者があいまいになってしまいます。

このような状況では、quot;deep copy"が本当に唯一の選択肢であり、これは関数で行う必要があります。