คำถามนี้ค่อนข้างได้รับการแช่แข็งที่ดังนั้นฉันจึงตัดสินใจลบที่นั่นและลองที่นี่แทน หากคุณคิดว่ามันไม่พอดีที่นี่อย่างน้อยโปรดแสดงความคิดเห็นเกี่ยวกับคำแนะนำวิธีการหาตัวอย่างฉันหลังจาก ...
คุณสามารถยกตัวอย่างได้หรือไม่ว่าการใช้ C99 VLA ให้ประโยชน์ที่เหนือกว่าบางอย่างเช่นฮีปมาตรฐานที่ใช้กลไก C ++ RAII ปัจจุบันหรือไม่
ตัวอย่างหลังจากฉันควร:
- บรรลุข้อได้เปรียบด้านประสิทธิภาพที่วัดได้ง่าย (10%) จากการใช้ heap
- ไม่มีวิธีแก้ปัญหาที่ดีซึ่งไม่จำเป็นต้องใช้ทั้งชุดเลย
- ประโยชน์ที่แท้จริงจากการใช้ขนาดไดนามิกแทนที่จะเป็นขนาดสูงสุดคงที่
- ไม่น่าจะทำให้เกิดการล้นสแต็คในสถานการณ์การใช้งานปกติ
- แข็งแรงพอที่จะล่อลวงนักพัฒนาที่ต้องการประสิทธิภาพในการรวมไฟล์ต้นฉบับ C99 ในโครงการ C ++
การเพิ่มความกระจ่างเกี่ยวกับบริบท: ฉันหมายถึง VLA ตามความหมายโดย C99 และไม่รวมอยู่ในมาตรฐาน C ++: int array[n]
โดยที่n
เป็นตัวแปร และฉันเป็นตัวอย่างของกรณีการใช้งานที่มันสำคัญกว่าทางเลือกอื่น ๆ ที่เสนอโดยมาตรฐานอื่น ๆ (C90, C ++ 11):
int array[MAXSIZE]; // C stack array with compile time constant size
int *array = calloc(n, sizeof int); // C heap array with manual free
int *array = new int[n]; // C++ heap array with manual delete
std::unique_ptr<int[]> array(new int[n]); // C++ heap array with RAII
std::vector<int> array(n); // STL container with preallocated size
ความคิดบางอย่าง:
- ฟังก์ชันรับค่า varargs ซึ่ง จำกัด การนับรายการเป็นสิ่งที่สมเหตุสมผล แต่ไม่มีข้อ จำกัด ด้านบนระดับ API ที่มีประโยชน์
- ฟังก์ชั่นวนซ้ำโดยที่กองซ้อนที่สูญเปล่าไม่พึงประสงค์
- การจัดสรรและการเผยแพร่ขนาดเล็กจำนวนมากซึ่งค่าใช้จ่ายในกองจะไม่ดี
- การจัดการอาเรย์หลายมิติ (เช่นเมทริกซ์ขนาดโดยพลการ) ซึ่งประสิทธิภาพมีความสำคัญและคาดว่าจะมีฟังก์ชั่นขนาดเล็กจำนวนมาก
- จากความคิดเห็น: อัลกอริทึมพร้อมกันที่จัดสรรกองมีค่าใช้จ่ายในการประสาน
วิกิพีเดียมีตัวอย่างที่ไม่ตรงตามเกณฑ์ของฉันเพราะความแตกต่างในทางปฏิบัติในการใช้กองดูอย่างน้อยก็ไม่เกี่ยวข้องกับบริบท นอกจากนี้ยังไม่เหมาะเนื่องจากไม่มีบริบทเพิ่มเติมดูเหมือนว่าการนับรายการอาจทำให้เกิดการล้นสแต็คได้เป็นอย่างดี
หมายเหตุ: ฉันเฉพาะรหัสตัวอย่างหรือข้อเสนอแนะของอัลกอริทึมที่จะได้รับประโยชน์จากสิ่งนี้สำหรับฉันที่จะใช้ตัวอย่างด้วยตนเอง
alloca
ซึ่งฉันคิดว่าเป็นสิ่งเดียวกัน) แต่สิ่งที่มีหลายเธรดเป็นสิ่งที่ดีคำถามแก้ไขเพื่อรวมไว้!
malloc
พฤติกรรมของ Linux นั้นสอดคล้องกับมาตรฐาน C หรือไม่
alloca()
จะจริงๆ Outshinemalloc()
ในสภาพแวดล้อมแบบมัลติเธรดเพราะการต่อสู้ล็อคในภายหลัง แต่นี่เป็นการยืดตัวจริงเนื่องจากอาร์เรย์ขนาดเล็กควรใช้ขนาดคงที่และอาร์เรย์ขนาดใหญ่อาจต้องการฮีปอยู่ดี