ประสิทธิภาพของการประกาศวัตถุ
ฉันเขียนโค้ดในการพิชิตมหาวิทยาลัยบางประเภทและสังเกตเห็นบางอย่างเมื่อฉันประกาศแผนที่ในวงดังเช่นด้านล่าง:
for (int i = 0; i < n; i++)
{
map<int, bool> hashMap;
//...
}
ต้องใช้เวลามากกว่า:
map<int, bool> hashMap;
for (int i = 0; i < n; i++)
{
hashMap.clear();
//...
}
ดังนั้นฉันจึงสงสัยว่าทำไมการประกาศออบเจ็กต์ในลูปจึงมีประสิทธิภาพที่แย่กว่าการเริ่มต้นใหม่อีกครั้ง
คำตอบ
ในโค้ดเวอร์ชันแรกตัวสร้างและตัวทำลายของโค้ดhashMap
จะถูกเรียกว่าn
ครั้งในขณะที่ในเวอร์ชันที่สองจะถูกเรียกเพียงครั้งเดียว
คำถามตามธรรมชาติคือเหตุใดการทำลายและสร้างmap
วัตถุใหม่จึงแตกต่างกันอย่างเห็นได้ชัดเมื่อเทียบกับการล้างและการนำกลับมาใช้ใหม่และวัตถุเดียวกัน สิ่งนี้สามารถตอบได้อย่างชัดเจนโดยการตรวจสอบmap
โค้ดจริงของการนำไปใช้งานเท่านั้นดังนั้นสิ่งต่อไปนี้จึงเป็นเพียงการคาดเดาที่น่าเชื่อถือ
std::mapโดยปกติจะใช้ต้นไม้สีแดง - ดำและเป็นเรื่องปกติสำหรับการใช้งานต้นไม้สีแดง - ดำที่จะใช้โหนดยามสำหรับใบ NIL ดูตัวอย่างประโยชน์ของโหนดยามในต้นไม้สีแดงดำ? . ทหารรักษาการณ์นี้จะต้องได้รับการจัดสรรทุกครั้งที่มีการสร้างต้นไม้จากนั้นจึงปล่อยเมื่อถูกทำลาย ในทางตรงกันข้ามclear
'ing a map
จะเทต้นไม้ แต่นำวัตถุภายในที่เกี่ยวข้องกลับมาใช้ใหม่
สำหรับตัวอย่างในชีวิตจริงเช่นการดำเนินการที่ไมโครซอฟท์คอนสตรัคเรียกชื่อ_Tree aptly _Alloc_sentinel_and_proxy();
เนื่องจากมีที่map
มาจาก_Tree
สิ่งนี้จึงถูกเรียกทุกครั้งที่สร้างmap
วัตถุ