Dalam proses porting kode dari C ++ ke Delphi, sangat sering harus menggunakan kode port menggunakan koleksi STL. Set koleksi yang ditawarkan oleh Delphi sangat pertapa dan kadang -kadang
Sulit untuk menemukan pengganti yang cocok. Terkadang Anda menemukan kode di mana objek ditempatkan di tumpukan atau menggunakan pengalokasi memori sendiri.
Saya sangat tidak menyukai mode penyegaran data yang disarankan. Untuk memperbarui data, saya perlu mengambil nilai yang ditempatkan di dalamnya dari koleksi, memperbarui nilai dan kemudian mengembalikan nilai yang diubah. Ini membutuhkan setidaknya dua operasi salinan tambahan. Kami tidak dapat meneruskan item data sebagai parameter VAR ke prosedur.
Tidak ada cara bagi koleksi untuk mengubah cara memori dialokasikan. Memori untuk objek dan catatan dialokasikan dari satu tumpukan bersama. Setelah digunakan, memori harus dikembalikan dengan hati -hati ke tumpukan. Membebaskan memori dengan benar tidak selalu merupakan tugas yang sepele, dan dibutuhkan waktu prosesor dan waktu programmer untuk menulis kode ini. Di STL, Anda dapat menentukan alokasi memori Anda sendiri untuk semua jenis koleksi.
Implementasi ini bergantung pada catatan dan pointer. Sejauh ini, saya tidak melihat cara untuk mengimplementasikan apa yang saya inginkan menggunakan objek standar. Penciptaan dan penghancuran objek menggunakan tumpukan memori bersama. Tidak ada cara untuk menempatkan objek di tumpukan panggilan. "Objek" lama yang baik dinyatakan sudah usang dan menambahkan fitur baru untuk jenis ini tidak didukung.
Implementasi koleksi ini bergantung pada mekanisme manajemen memori berdasarkan daerah memori yang diketik. Penggunaan daerah memori yang diketik memungkinkan untuk menyederhanakan solusi sejumlah tugas:
Tugas membebaskan memori menjadi lebih mudah dan dapat dilakukan lebih cepat.
Ini adalah fakta yang terkenal bahwa manajer memori standar harus aman. Hanya satu utas yang dapat mengakses manajer memori pada waktu tertentu. Memori mengalokasikan dan membebaskan menggunakan mekanisme eksklusi timbal balik dan bukan operasi yang cepat, terutama jika memori sangat defragment. Saat menggunakan wilayah memori yang diketik terpisah, kami merujuk pada manajer memori standar hanya pada saat meningkatkan memori yang diperlukan dan menghapus struktur setelah digunakan.
Dukungan untuk struktur dasar dengan kemampuan untuk menentukan alokasi memori. Elemen -elemen daftar diakses melalui pointer. Sebagai aturan, memori untuk nilai terletak di daerah memori tersegmentasi, yang tidak akan dipindahkan selama operasi. Jika perlu untuk meningkatkan memori suatu wilayah, segmen memori tambahan dialokasikan untuk itu. Ini berarti bahwa kami dapat mengakses item data yang terletak di wilayah tersebut melalui pointer.
Untuk array, kami menggunakan daerah memori yang berdekatan. Item data diakses melalui indeks. Jika perlu, tingkatkan memori wilayah, segmen dengan ukuran besar dialokasikan untuk itu dan data dari segmen memori saat ini disalin ke segmen baru. Setelah menyalin data, segmen lama akan dihapus.
Pada akhirnya, bekerja melalui pointer sangat nyaman dan efisien. Kode menjadi jauh lebih sederhana dan lebih ringkas. Namun, jika Anda tidak memiliki pengalaman dengan pointer, mudah untuk "menembak diri sendiri di kaki". Untuk penggemar enkapsulasi, Anda dapat mengumpulkan struktur yang diinginkan sebagai bidang pribadi. Selanjutnya, kami hanya membuka bagian yang diperlukan dari antarmuka dengan mengesampingkan metode dan properti yang diperlukan di bagian publik. Jika kami menempatkan opsi inline, kami menghindari biaya tambahan. Kompiler Delphi tidak akan menghasilkan kode untuk metode yang diganti. Di tempat panggilan metode, akan ada panggilan langsung ke metode struktur agregat.
TsgTuple<T1, ...> tupel generikTsgArray<T> Array generik dengan alokasi memori dari daerah memori bersamaTsgList<T> Daftar nilai generikTsgRecordList<T> Daftar nilai generik yang diakses oleh pointerTsgLinkedList<T> Daftar ditautkan dua arah generikTsgForwardList<T> Daftar Tertaut Generik searahTsgHashMap<Key, T> kamus tidak tertib generikTsgMap<Key, T> Kamus yang Diperintahkan Generik Berdasarkan 2-3 TreeTsgSet<Key> Set generik berdasarkan 2-3 pohonTsgPointerArray Daftar Pointer yang Tidak TerpisahTsgPointerList Daftar nilai yang diakses oleh PointerTCustomLinkedList DAFTAR TERKADIAN BIDIRECTIONAL TERTANGGUNG JAWABTsgCustomTree Untyped berdasarkan 2-3 pohon Kami sudah mulai menambahkan iterator Delphi. Sekarang kita dapat menggunakan konstruksi for p in List do; Yang paling menarik adalah kami menggunakan catatan untuk mengimplementasikan iterator dan berfungsi! Dibandingkan dengan menggunakan objek, kode yang dihasilkan jauh lebih efisien dan, yang bagus, tidak ada panggilan ke tumpukan, variabel untuk iterator terletak di tumpukan. Ini ternyata menjadi kejutan yang cukup menyenangkan bagi saya!
Kemampuan untuk menentukan alokasi memori juga berarti bahwa kami bekerja terutama dengan catatan. Biasanya, beberapa struktur menggunakan satu atau lebih daerah memori, yang merupakan manajer memori sederhana. Setelah menggunakan struktur, kami memiliki peluang mengembalikan semua memori yang ditempati dengan membebaskan wilayah memori. Kami memiliki batasan menggunakan warisan. Dalam beberapa kasus, kita dapat mengganti warisan dengan agregasi dan pembantu. Biasanya untuk mengimplementasikan koleksi, ini bukan masalah. Menggunakan catatan memungkinkan koleksi ditumpuk. Ini terkadang sangat nyaman.
Kumpulan objek memungkinkan Anda untuk mengelola penggunaan kembali struktur saat membuat objek adalah memori intensif atau ketika sejumlah objek dari jenis tertentu dapat dibuat.
Jika kita berhenti menggunakan sesuatu, itu tidak selalu layak untuk menghapus struktur atau objek. Sering kali objek harus diciptakan kembali.