C言語による浅いコピーと深いコピーの説明
以下は、浅いコピーと深いコピーについて AI に回答させたもの。 C 言語だと内部の処理が見えるので理解が進む。
浅いコピー (シャローコピー):
- 浅いコピーは、オブジェクトの内部を再帰的にコピーする際に、データを参照としてコピーする。
- つまり、コピーされた結果はメモリ上で共有されているデータであり、元のデータと同じメモリ番地を共有する。
- 例えば、配列や構造体を浅いコピーすると、その内部の要素は同じメモリ上に存在する。
- 速度が重要な場合や、オブジェクトをメモリ上で共有したい場合に使う。
- 注意点: シャローコピーされたオブジェクトを変更すると、共有している別のオブジェクトにも影響が及ぶことがある。
深いコピー (ディープコピー):
- 深いコピーは、オブジェクトの内部を再帰的にコピーする際に、データを丸ごとコピーする。
- つまり、コピーされた結果は元のデータとメモリ上で共有されない新しいデータである。
- 例えば、配列や構造体を深いコピーすると、その内部の要素は別のメモリ領域に配置される。
- 安全性が重要な場合に使う。 変更がコピー元のオブジェクトや他のオブジェクトに伝わらないため、安全に利用できる。
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
は新しいメモリ領域にコピーされています。