C言語による浅いコピーと深いコピーの説明

以下は、浅いコピーと深いコピーについて AI に回答させたもの。 C 言語だと内部の処理が見えるので理解が進む。

  1. 浅いコピー (シャローコピー):

    • 浅いコピーは、オブジェクトの内部を再帰的にコピーする際に、データを参照としてコピーする。
    • つまり、コピーされた結果はメモリ上で共有されているデータであり、元のデータと同じメモリ番地を共有する。
    • 例えば、配列や構造体を浅いコピーすると、その内部の要素は同じメモリ上に存在する。
    • 速度が重要な場合や、オブジェクトをメモリ上で共有したい場合に使う。
    • 注意点: シャローコピーされたオブジェクトを変更すると、共有している別のオブジェクトにも影響が及ぶことがある。
  2. 深いコピー (ディープコピー):

    • 深いコピーは、オブジェクトの内部を再帰的にコピーする際に、データを丸ごとコピーする。
    • つまり、コピーされた結果は元のデータとメモリ上で共有されない新しいデータである。
    • 例えば、配列や構造体を深いコピーすると、その内部の要素は別のメモリ領域に配置される。
    • 安全性が重要な場合に使う。 変更がコピー元のオブジェクトや他のオブジェクトに伝わらないため、安全に利用できる。

C言語での実装例:

 1#include <stdio.h>
 2#include <string.h>
 3
 4// 構造体の例
 5struct Person {
 6    char name[20];
 7    int age;
 8};
 9
10int main() {
11    // オリジナルのPersonオブジェクト
12    struct Person original;
13    strcpy(original.name, "Alice");
14    original.age = 30;
15
16    // シャローコピー
17    struct Person shallowCopy = original; // メモリ上で共有される
18    printf("Shallow Copy: %s, %d\n", shallowCopy.name, shallowCopy.age);
19
20    // ディープコピー
21    struct Person deepCopy;
22    memcpy(&deepCopy, &original, sizeof(struct Person)); // メモリ上で独立
23    printf("Deep Copy: %s, %d\n", deepCopy.name, deepCopy.age);
24
25    return 0;
26}

この例では、shallowCopyは元のオブジェクトと同じメモリを共有し、deepCopyは新しいメモリ領域にコピーされています。