ประสิทธิภาพ :
มันขึ้นอยู่กับ.
ในกรณีเฉพาะของคุณจะไม่มีความแตกต่างของประสิทธิภาพเนื่องจากทั้งสองจะถูกวางในหน่วยความจำในทำนองเดียวกัน
ในกรณีที่เฉพาะเจาะจงมาก (ถ้าคุณใช้โครงสร้างว่างเปล่าเป็นหนึ่งในสมาชิกข้อมูล) ดังนั้นstd::pair<>อาจใช้ประโยชน์จากการเพิ่มประสิทธิภาพฐานที่ว่างเปล่า (EBO) และมีขนาดต่ำกว่าเทียบเท่าโครงสร้าง และขนาดที่ต่ำกว่าโดยทั่วไปหมายถึงประสิทธิภาพที่สูงขึ้น:
struct Empty {};
struct Thing { std::string name; Empty e; };
int main() {
std::cout << sizeof(std::string) << "\n";
std::cout << sizeof(std::tuple<std::string, Empty>) << "\n";
std::cout << sizeof(std::pair<std::string, Empty>) << "\n";
std::cout << sizeof(Thing) << "\n";
}
พิมพ์: 32, 32, 40, 40 ideone
หมายเหตุ: ฉันไม่ได้ตระหนักถึงการใช้งานใด ๆ ที่ใช้เคล็ดลับ EBO สำหรับคู่ปกติ แต่โดยทั่วไปจะใช้สำหรับสิ่งอันดับ
การอ่าน :
นอกเหนือจากการปรับให้เหมาะสมแบบไมโครอย่างไรก็ตามโครงสร้างที่ตั้งชื่อนั้นถูกต้องตามหลักสรีรศาสตร์มากกว่า
ฉันหมายความว่าmap[k].firstไม่ใช่เรื่องเลวร้ายในขณะที่get<0>(map[k])แทบจะไม่สามารถเข้าใจได้ ความคมชัดmap[k].nameที่แสดงถึงสิ่งที่เรากำลังอ่านในทันที
ทุกอย่างมีความสำคัญมากขึ้นเมื่อประเภทสามารถแปลงให้เป็นประเภทอื่นได้เนื่องจากการสลับเปลี่ยนเป็นประเภทที่ไม่ได้ตั้งใจกลายเป็นปัญหาที่แท้จริง
คุณอาจต้องการอ่านเกี่ยวกับ Structural vs Nominal Typing Enteเป็นประเภทเฉพาะที่สามารถดำเนินการได้โดยสิ่งที่คาดหวังEnteอะไรก็ตามที่สามารถทำงานได้std::pair<std::string, bool>สามารถทำงานกับพวกเขาได้ ... แม้ว่าจะมีstd::stringหรือboolไม่มีสิ่งที่พวกเขาคาดหวังเพราะstd::pairไม่มีความหมายที่เกี่ยวข้องกับมัน
การบำรุงรักษา :
ในแง่ของการบำรุงรักษาpairที่เลวร้ายที่สุดคือ คุณไม่สามารถเพิ่มฟิลด์
tupleงานแสดงสินค้าที่ดีขึ้นในเรื่องนั้นตราบใดที่คุณผนวกฟิลด์ใหม่ทุกฟิลด์ที่มีอยู่จะยังคงเข้าถึงได้โดยดัชนีเดียวกัน ซึ่งไม่น่าเชื่อถือเหมือน แต่ก่อนอย่างน้อยคุณไม่จำเป็นต้องไปและอัปเดต
structเป็นผู้ชนะที่ชัดเจน คุณสามารถเพิ่มฟิลด์ได้ทุกที่ที่ต้องการ
สรุปแล้ว:
pair เป็นสิ่งที่เลวร้ายที่สุดของทั้งสองโลก
tuple อาจมีขอบเล็กน้อยในกรณีที่เฉพาะเจาะจงมาก (ประเภทที่ว่างเปล่า)
structใช้
หมายเหตุ: หากคุณใช้ getters แล้วคุณสามารถใช้ฐานที่ว่างเปล่าหลอกตัวเองโดยไม่ต้องลูกค้าต้องรู้เกี่ยวกับมันเช่นเดียวกับในstruct Thing: Empty { std::string name; }; ซึ่งเป็นเหตุผลว่าทำไมEncapsulationจึงเป็นหัวข้อถัดไปที่คุณควรคำนึงถึง
std::pairคือโครงสร้าง