Kinerja :
Tergantung.
Dalam kasus khusus Anda, tidak akan ada perbedaan kinerja karena keduanya akan diletakkan dalam memori yang sama.
Dalam kasus yang sangat spesifik (jika Anda menggunakan struct kosong sebagai salah satu anggota data) maka std::pair<>
berpotensi menggunakan Empty Base Optimization (EBO) dan memiliki ukuran yang lebih rendah daripada setara struct. Dan ukuran yang lebih rendah umumnya berarti kinerja yang lebih tinggi:
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";
}
Cetakan: 32, 32, 40, 40 di ideone .
Catatan: Saya tidak mengetahui adanya implementasi yang benar-benar menggunakan trik EBO untuk pasangan reguler, namun umumnya digunakan untuk tupel.
Keterbacaan :
Terlepas dari optimasi mikro, struktur bernama lebih ergonomis.
Maksudku, map[k].first
tidak seburuk itu sementara get<0>(map[k])
hampir tidak bisa dimengerti. Kontras dengan map[k].name
yang segera menunjukkan apa yang kita baca.
Ini semua menjadi lebih penting ketika tipe-tipe tersebut dapat dipertukarkan satu sama lain, karena bertukar secara tidak sengaja menjadi perhatian nyata.
Anda mungkin juga ingin membaca tentang Pengetikan Struktural vs Nominal. Ente
adalah jenis khusus yang hanya dapat dioperasikan oleh hal-hal yang diharapkan Ente
, apa pun yang dapat beroperasi std::pair<std::string, bool>
dapat beroperasi pada mereka ... bahkan ketika std::string
atau bool
tidak berisi apa yang mereka harapkan, karena std::pair
tidak memiliki semantik yang terkait dengannya.
Perawatan :
Dalam hal perawatan, pair
adalah yang terburuk. Anda tidak dapat menambahkan bidang.
tuple
lebih baik dalam hal itu, selama Anda menambahkan bidang baru semua bidang yang ada masih diakses oleh indeks yang sama. Yang tidak dapat dipahami seperti sebelumnya tetapi setidaknya Anda tidak perlu pergi dan memperbaruinya.
struct
adalah pemenang yang jelas. Anda dapat menambahkan bidang di mana pun Anda suka.
Kesimpulannya:
pair
adalah yang terburuk dari kedua dunia,
tuple
mungkin memiliki sedikit keunggulan dalam kasus yang sangat spesifik (tipe kosong),
- gunakan
struct
.
Catatan: jika Anda menggunakan getter, maka Anda dapat menggunakan trik basis kosong sendiri tanpa klien harus mengetahuinya seperti pada struct Thing: Empty { std::string name; }
; itulah sebabnya enkapsulasi adalah topik berikutnya yang harus Anda perhatikan sendiri.
std::pair
adalah sebuah struct.