ประสิทธิภาพของการประกาศวัตถุ

Jan 03 2021

ฉันเขียนโค้ดในการพิชิตมหาวิทยาลัยบางประเภทและสังเกตเห็นบางอย่างเมื่อฉันประกาศแผนที่ในวงดังเช่นด้านล่าง:

for (int i = 0; i < n; i++)
{
    map<int, bool> hashMap;
    //...
}

ต้องใช้เวลามากกว่า:

map<int, bool> hashMap;
for (int i = 0; i < n; i++)
{
    hashMap.clear();
    //...
}

ดังนั้นฉันจึงสงสัยว่าทำไมการประกาศออบเจ็กต์ในลูปจึงมีประสิทธิภาพที่แย่กว่าการเริ่มต้นใหม่อีกครั้ง

คำตอบ

2 dxiv Jan 04 2021 at 10:59

ในโค้ดเวอร์ชันแรกตัวสร้างและตัวทำลายของโค้ดhashMapจะถูกเรียกว่าnครั้งในขณะที่ในเวอร์ชันที่สองจะถูกเรียกเพียงครั้งเดียว

คำถามตามธรรมชาติคือเหตุใดการทำลายและสร้างmapวัตถุใหม่จึงแตกต่างกันอย่างเห็นได้ชัดเมื่อเทียบกับการล้างและการนำกลับมาใช้ใหม่และวัตถุเดียวกัน สิ่งนี้สามารถตอบได้อย่างชัดเจนโดยการตรวจสอบmapโค้ดจริงของการนำไปใช้งานเท่านั้นดังนั้นสิ่งต่อไปนี้จึงเป็นเพียงการคาดเดาที่น่าเชื่อถือ

std::mapโดยปกติจะใช้ต้นไม้สีแดง - ดำและเป็นเรื่องปกติสำหรับการใช้งานต้นไม้สีแดง - ดำที่จะใช้โหนดยามสำหรับใบ NIL ดูตัวอย่างประโยชน์ของโหนดยามในต้นไม้สีแดงดำ? . ทหารรักษาการณ์นี้จะต้องได้รับการจัดสรรทุกครั้งที่มีการสร้างต้นไม้จากนั้นจึงปล่อยเมื่อถูกทำลาย ในทางตรงกันข้ามclear'ing a mapจะเทต้นไม้ แต่นำวัตถุภายในที่เกี่ยวข้องกลับมาใช้ใหม่

สำหรับตัวอย่างในชีวิตจริงเช่นการดำเนินการที่ไมโครซอฟท์คอนสตรัคเรียกชื่อ_Tree aptly _Alloc_sentinel_and_proxy();เนื่องจากมีที่mapมาจาก_Treeสิ่งนี้จึงถูกเรียกทุกครั้งที่สร้างmapวัตถุ