Bisakah Anda menetapkan satu instance dari struct ke yang lain, seperti:
struct Test t1;
struct Test t2;
t2 = t1;
Saya telah melihatnya bekerja untuk struktur sederhana, tetapi apakah itu bekerja untuk struktur yang kompleks?
Bagaimana kompiler mengetahui cara menyalin item data tergantung pada jenisnya, yaitu membedakan antara int
string dan?
Ya, tugas didukung untuk struct. Namun, ada masalah:
Sekarang pointer dari kedua struct menunjuk ke blok memori yang sama - kompiler tidak menyalin data yang ditunjuk. Sekarang sulit untuk mengetahui instance struct mana yang memiliki data. Inilah sebabnya mengapa C ++ menemukan konsep operator penugasan yang dapat ditentukan pengguna - Anda dapat menulis kode khusus untuk menangani kasus ini.
sumber
struct
itu sendiri dengan jelas disalin.Lihat Pertama pada contoh ini:
Kode C untuk program C sederhana diberikan di bawah ini
Kode ASM Setara untuk foo_assign () adalah
Seperti yang Anda lihat bahwa tugas hanya diganti dengan instruksi "mov" dalam perakitan, operator penugasan berarti memindahkan data dari satu lokasi memori ke lokasi memori lain. Tugas hanya akan melakukannya untuk anggota langsung dari suatu struktur dan akan gagal untuk menyalin ketika Anda memiliki tipe data kompleks dalam suatu struktur. Di sini COMPLEX berarti Anda tidak dapat memiliki array pointer, menunjuk ke daftar.
Array karakter dalam struktur itu sendiri tidak akan berfungsi pada kebanyakan kompiler, ini karena tugas hanya akan mencoba untuk menyalin tanpa melihat tipe data menjadi tipe kompleks.
sumber
Ini adalah salinan sederhana, seperti yang akan Anda lakukan
memcpy()
(memang, beberapa kompiler benar-benar menghasilkan panggilanmemcpy()
untuk kode itu). Tidak ada "string" di C, hanya pointer ke sekelompok a chars. Jika struktur sumber Anda berisi pointer seperti itu, maka pointer akan disalin, bukan karakter itu sendiri.sumber
memcpy
, lihat di sini: godbolt.org/z/nPxqWc - Tapi sekarang jika saya melewati pointer identika
danb
, dan*a = *b
diterjemahkan kememcpy
perilaku yang tidak terdefinisi, karena untukmemcpy
"Area memori tidak boleh tumpang tindih." (mengutip dari halaman manual). Jadi apakah kompiler salah dalam menggunakanmemcpy
atau saya salah dalam menulis tugas seperti itu?Apakah maksud Anda "Kompleks" seperti dalam bilangan kompleks dengan bagian nyata dan imajiner? Ini sepertinya tidak mungkin, jadi jika tidak Anda harus memberikan contoh karena "kompleks" tidak berarti spesifik dalam hal bahasa C.
Anda akan mendapatkan salinan memori langsung dari struktur; apakah itu yang Anda inginkan tergantung pada strukturnya. Misalnya jika struktur berisi pointer, kedua salinan akan menunjuk ke data yang sama. Ini mungkin atau mungkin bukan yang Anda inginkan; itu tergantung pada desain program Anda.
Untuk melakukan salinan 'pintar' (atau salinan 'dalam'), Anda perlu mengimplementasikan fungsi untuk melakukan salinan. Ini bisa sangat sulit untuk dicapai jika struktur itu sendiri mengandung pointer dan struktur yang juga mengandung pointer, dan mungkin pointer ke struktur seperti itu (mungkin itu yang Anda maksud dengan "kompleks"), dan sulit untuk mempertahankannya. Solusi sederhana adalah dengan menggunakan C ++ dan mengimplementasikan copy constructor dan operator penugasan untuk setiap struktur atau kelas, maka masing-masing menjadi bertanggung jawab atas semantik salinannya sendiri, Anda dapat menggunakan sintaks penugasan, dan lebih mudah dipelihara.
sumber