วิธีการแบบแยกส่วนค่อนข้างมีประโยชน์โดยทั่วไป (พกพาและสะอาด) ดังนั้นฉันจึงลองโปรแกรมโมดูลเป็นอิสระจากโมดูลอื่น ๆ เท่าที่จะทำได้ แนวทางของฉันส่วนใหญ่ขึ้นอยู่กับ struct ที่อธิบายถึงโมดูลเอง ฟังก์ชั่นการเริ่มต้นจะตั้งค่าพารามิเตอร์หลักหลังจากนั้นตัวจัดการ (ตัวชี้ไปยังโครงสร้าง desriptive) จะถูกส่งผ่านไปยังฟังก์ชันใดก็ตามภายในโมดูลที่เรียกว่า
ตอนนี้ฉันสงสัยว่าวิธีที่ดีที่สุดของหน่วยความจำการจัดสรรสำหรับโครงสร้างที่อธิบายถึงโมดูลอาจเป็น ถ้าเป็นไปได้ฉันต้องการสิ่งต่อไปนี้:
- โครงสร้างทึบแสงดังนั้นโครงสร้างอาจเปลี่ยนแปลงได้โดยการใช้ฟังก์ชั่นอินเตอร์เฟสที่มีให้เท่านั้น
- หลายกรณี
- หน่วยความจำที่จัดสรรโดย linker
ฉันเห็นความเป็นไปได้ดังต่อไปนี้ซึ่งขัดแย้งกับหนึ่งในเป้าหมายของฉัน:
ประกาศทั่วโลก
หลายอินสแตนซ์ทั้งหมดถูกลิงค์โดย linker แต่ struct ไม่ทึบแสง
(#includes)
module_struct module;
void main(){
module_init(&module);
}
malloc
opaque โครงสร้างหลายอินสแตนซ์แต่ allcotion on heap
ใน module.h:
typedef module_struct Module;
ในฟังก์ชั่น module.c init, malloc และตัวชี้กลับไปยังหน่วยความจำที่จัดสรรไว้
module_mem = malloc(sizeof(module_struct ));
/* initialize values here */
return module_mem;
ใน main.c
(#includes)
Module *module;
void main(){
module = module_init();
}
ประกาศในโมดูล
opaque struct ซึ่งจัดสรรโดย linker จำนวนอินสแตนซ์ที่กำหนดไว้ล่วงหน้าเท่านั้น
เก็บ struct และหน่วยความจำทั้งหมดไว้ในโมดูลและอย่าเปิดเผยตัวจัดการหรือ struct
(#includes)
void main(){
module_init(_no_param_or_index_if_multiple_instances_possible_);
}
มีตัวเลือกในการรวมสิ่งเหล่านี้สำหรับโครงสร้างทึบแสง, linker แทนการจัดสรรฮีปและอินสแตนซ์จำนวนมาก / หลาย ๆ ครั้งหรือไม่?
วิธีการแก้
ตามที่เสนอในคำตอบบางข้อด้านล่างฉันคิดว่าวิธีที่ดีที่สุดคือ:
- จองพื้นที่สำหรับโมดูล MODULE_MAX_INSTANCE_COUNT ในไฟล์ซอร์สโมดูล
- ห้ามกำหนด MODULE_MAX_INSTANCE_COUNT ในโมดูลของตนเอง
- เพิ่ม #ifndef MODULE_MAX_INSTANCE_COUNT #error ไปยังไฟล์ส่วนหัวโมดูลเพื่อให้แน่ใจว่าผู้ใช้โมดูลทราบถึงข้อ จำกัด นี้และกำหนดจำนวนอินสแตนซ์สูงสุดที่ต้องการสำหรับแอปพลิเคชัน
- ในการเริ่มต้นของอินสแตนซ์กลับทั้งที่อยู่หน่วยความจำ (* เป็นโมฆะ) ของโครงสร้าง desricptive หรือดัชนีโมดูล (สิ่งที่คุณต้องการมากขึ้น)