ในกระบวนการพอร์ตรหัสจาก C ++ ถึง Delphi มักจะต้องใช้รหัสพอร์ตโดยใช้คอลเลกชัน STL ชุดของคอลเลกชันที่นำเสนอโดย Delphi นั้นเป็นนักพรตมากและบางครั้ง
เป็นการยากที่จะหาสิ่งทดแทนที่เหมาะสม บางครั้งคุณเจอรหัสที่วัตถุถูกวางไว้ในสแต็กหรือใช้หน่วยจัดสรรหน่วยความจำของตัวเอง
ฉันไม่ชอบโหมดรีเฟรชข้อมูลที่แนะนำจริงๆ ในการอัปเดตข้อมูลฉันต้องดึงค่าที่วางไว้จากคอลเลกชันอัปเดตค่าแล้วนำค่าที่เปลี่ยนแปลงกลับมา สิ่งนี้ต้องใช้การคัดลอกเพิ่มเติมอย่างน้อยสองครั้ง เราไม่สามารถส่งรายการข้อมูลเป็นพารามิเตอร์ VAR ไปยังขั้นตอน
ไม่มีวิธีที่คอลเลกชันจะเปลี่ยนวิธีการจัดสรรหน่วยความจำ หน่วยความจำสำหรับวัตถุและบันทึกได้รับการจัดสรรจากกองที่ใช้ร่วมกัน หลังการใช้งานหน่วยความจำจะต้องถูกส่งกลับไปยังกองอย่างระมัดระวัง การปลดปล่อยหน่วยความจำอย่างถูกต้องไม่ได้เป็นงานที่ไม่สำคัญเสมอไปและต้องใช้เวลาทั้งโปรเซสเซอร์และเวลาของโปรแกรมเมอร์ในการเขียนโค้ดนี้ ใน STL คุณสามารถระบุการจัดสรรหน่วยความจำของคุณเองสำหรับคอลเลกชันทุกประเภท
การใช้งานนี้ขึ้นอยู่กับบันทึกและพอยน์เตอร์ จนถึงตอนนี้ฉันไม่เห็นวิธีที่จะใช้สิ่งที่ฉันต้องการโดยใช้วัตถุมาตรฐาน การสร้างและการทำลายวัตถุใช้กองหน่วยความจำที่ใช้ร่วมกัน ไม่มีวิธีวางวัตถุบนสแต็กการโทร "วัตถุ" เก่าที่ดีประกาศเลิกใช้แล้วและเพิ่มคุณสมบัติใหม่สำหรับประเภทนี้ไม่รองรับ
การใช้งานคอลเลกชันนี้ขึ้นอยู่กับการจัดการหน่วยความจำกลไกตามภูมิภาคหน่วยความจำที่พิมพ์ การใช้พื้นที่หน่วยความจำที่พิมพ์ลงทำให้สามารถลดความซับซ้อนของการแก้ปัญหาของงานจำนวนมากได้:
งานของการปลดปล่อยหน่วยความจำจะง่ายขึ้นและสามารถทำได้เร็วขึ้นมาก
มันเป็นความจริงที่รู้จักกันดีว่าตัวจัดการหน่วยความจำมาตรฐานจะต้องปลอดภัยกับเธรด เธรดเพียงหนึ่งเธรดสามารถเข้าถึงตัวจัดการหน่วยความจำได้ในเวลาใดก็ได้ การจัดสรรและการปลดปล่อยหน่วยความจำใช้กลไกการยกเว้นซึ่งกันและกันและไม่ใช่การทำงานที่รวดเร็วโดยเฉพาะอย่างยิ่งหากหน่วยความจำได้รับการจัดเรียงอย่างหนัก เมื่อใช้พื้นที่หน่วยความจำที่พิมพ์แยกต่างหากเราจะอ้างถึงตัวจัดการหน่วยความจำมาตรฐานเฉพาะในขณะที่เพิ่มหน่วยความจำที่ต้องการและการลบโครงสร้างหลังจากการใช้งาน
รองรับโครงสร้างพื้นฐานที่มีความสามารถในการระบุการจัดสรรหน่วยความจำ องค์ประกอบของรายการสามารถเข้าถึงได้ผ่านพอยน์เตอร์ ตามกฎแล้วหน่วยความจำสำหรับค่าจะอยู่ในพื้นที่หน่วยความจำที่เรียกว่าแบ่งส่วนซึ่งจะไม่ถูกย้ายระหว่างการดำเนินการ หากจำเป็นต้องเพิ่มหน่วยความจำของภูมิภาคส่วนหน่วยความจำเพิ่มเติมจะถูกจัดสรรไว้ ซึ่งหมายความว่าเราสามารถเข้าถึงรายการข้อมูลที่อยู่ในภูมิภาคดังกล่าวผ่านตัวชี้
สำหรับอาร์เรย์เราใช้พื้นที่หน่วยความจำที่ต่อเนื่องกัน รายการข้อมูลสามารถเข้าถึงได้ผ่านดัชนี หากจำเป็นให้เพิ่มหน่วยความจำของภูมิภาคส่วนที่มีขนาดใหญ่จะถูกจัดสรรและข้อมูลจากเซ็กเมนต์หน่วยความจำปัจจุบันถูกคัดลอกไปยังเซ็กเมนต์ใหม่ หลังจากคัดลอกข้อมูลส่วนเก่าจะถูกลบ
ในที่สุดการทำงานผ่านพอยน์เตอร์นั้นสะดวกและมีประสิทธิภาพมาก รหัสกลายเป็นง่ายขึ้นและกระชับมากขึ้น อย่างไรก็ตามหากคุณไม่มีประสบการณ์กับพอยน์เตอร์มันเป็นเรื่องง่ายที่จะ "ยิงตัวเองด้วยเท้า" สำหรับแฟน ๆ ของการห่อหุ้มคุณสามารถรวมโครงสร้างที่ต้องการเป็นสนามส่วนตัว ต่อไปเราจะเปิดเฉพาะส่วนที่จำเป็นของอินเทอร์เฟซโดยการแทนที่วิธีการและคุณสมบัติที่จำเป็นในส่วนสาธารณะ หากเราใส่ตัวเลือกอินไลน์เราจะหลีกเลี่ยงค่าใช้จ่ายเพิ่มเติม คอมไพเลอร์ Delphi จะไม่สร้างรหัสสำหรับวิธีการแทนที่ ในสถานที่ของการโทรวิธีจะมีการโทรโดยตรงไปยังวิธีการรวมโครงสร้าง
TsgTuple<T1, ...> tuples ทั่วไปTsgArray<T> อาร์เรย์ทั่วไปพร้อมการจัดสรรหน่วยความจำจากภูมิภาคหน่วยความจำที่ใช้ร่วมกันTsgList<T> รายการค่าทั่วไปTsgRecordList<T> รายการทั่วไปของค่าที่เข้าถึงโดยตัวชี้TsgLinkedList<T> รายการเชื่อมโยงแบบสองทิศทางทั่วไปTsgForwardList<T> รายการเชื่อมโยงทิศทางเดียวทั่วไปTsgHashMap<Key, T> พจนานุกรมที่ไม่ได้เรียงลำดับทั่วไปTsgMap<Key, T> พจนานุกรมสั่งซื้อทั่วไปตาม 2-3 TreeTsgSet<Key> ชุดทั่วไปตาม 2-3 ต้นTsgPointerArray รายการพอยน์เตอร์ที่ไม่ได้พิมพ์TsgPointerList รายการที่ไม่ได้รับค่าของค่าที่เข้าถึงได้โดยตัวชี้TCustomLinkedList รายการเชื่อมโยงแบบสองทิศทางที่ไม่ได้กำหนดTsgCustomTree พจนานุกรมที่ไม่ได้พิมพ์ตาม 2-3 ต้น เราเริ่มเพิ่มตัววนซ้ำ Delphi ตอนนี้เราสามารถใช้การก่อสร้าง for p in List do; สิ่งที่น่าสนใจที่สุดคือเราใช้ เร็กคอร์ด เพื่อใช้ตัววนซ้ำและใช้งานได้! เมื่อเปรียบเทียบกับการใช้วัตถุโค้ดที่สร้างขึ้นนั้นมีประสิทธิภาพมากขึ้นและเป็นสิ่งที่ดีไม่มีการโทรไปยังกองตัวแปรสำหรับตัววนซ้ำจะอยู่บนสแต็ก สิ่งนี้กลายเป็นเรื่องน่าประหลาดใจสำหรับฉัน!
ความสามารถในการระบุการจัดสรรหน่วยความจำยังหมายความว่าเราทำงานเป็นหลักกับบันทึก โดยทั่วไปแล้วโครงสร้างบางอย่างจะใช้พื้นที่หน่วยความจำอย่างน้อยหนึ่งรายการซึ่งเป็นตัวจัดการหน่วยความจำอย่างง่าย หลังจากใช้โครงสร้างเรามีโอกาสส่งคืนหน่วยความจำทั้งหมดที่ถูกครอบครองโดยการทำให้พื้นที่หน่วยความจำเพิ่มขึ้น เรามีข้อ จำกัด โดยใช้การสืบทอด ในบางกรณีเราสามารถแทนที่การสืบทอดด้วยการรวมและผู้ช่วย โดยทั่วไปสำหรับการใช้คอลเลกชันนี่ไม่ใช่ปัญหา การใช้ระเบียนช่วยให้คอลเลกชันเรียงซ้อนกัน บางครั้งก็สะดวกมาก
พูลวัตถุช่วยให้คุณจัดการการใช้โครงสร้างซ้ำเมื่อสร้างวัตถุเป็นหน่วยความจำที่เข้มข้นหรือเมื่อสามารถสร้างวัตถุจำนวน จำกัด ได้
หากเราหยุดใช้บางสิ่งบางอย่างมันไม่คุ้มค่าที่จะลบโครงสร้างหรือวัตถุเสมอไป บ่อยครั้งที่วัตถุจะต้องสร้างใหม่