Performans :
Değişir.
Özel durumunuzda performans farkı olmayacak çünkü ikisi de hafızaya yerleştirilecek.
Çok özel bir durumda (eğer veri üyelerinden biri olarak boş bir yapı kullanıyorsanız ), o zaman std::pair<>potansiyel olarak Boş Temel Optimizasyonu (EBO) kullanabilir ve yapı eşdeğerinden daha düşük bir boyuta sahip olabilir. Ve düşük boyut genellikle daha yüksek performans anlamına gelir:
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";
}
Baskı: 32, 32, 40, 40 ideone üzerinde .
Not: EBO hilesini normal çiftler için kullanan herhangi bir uygulamanın farkında değilim, ancak genellikle tuples için kullanılıyor.
Okunabilirlik :
Ancak, mikro optimizasyonların yanı sıra, adlandırılmış bir yapı daha ergonomiktir.
Yani, map[k].firsto kadar da kötü değil get<0>(map[k]), ancak anlaşılabilir bir durumdur. map[k].nameHangi ile hemen okuduğumuzu gösteren kontrast .
Bu tipler birbirlerine çevrilebilir olduğunda her şey daha önemlidir, çünkü onları yanlışlıkla değiştirmek gerçek bir endişe haline gelir.
Ayrıca Yapısal vs Nominal Yazma hakkında okumak isteyebilirsiniz. Enteyalnızca beklenen şeyler tarafından çalıştırılabilecek belirli bir türdür; üzerinde Enteçalışabilecek herhangi bir şey, üzerinde beklediklerini içermese veya içermese std::pair<std::string, bool>bile, üzerinde çalışabilir , çünkü onunla ilişkili hiçbir anlam ifade etmemektedir .std::stringboolstd::pair
Bakım :
Bakım açısından pairen kötüsüdür. Bir alan ekleyemezsiniz.
tupleYeni alanı eklediğiniz sürece mevcut tüm alanlara aynı endeks ile erişilir. Bu eskisi kadar esrarengiz ama en azından onları güncellemene gerek yok.
structaçık kazanan. Dilediğiniz yere alanlar ekleyebilirsiniz.
Sonuç olarak:
pair her iki dünyanın da en kötüsü
tuple çok özel bir durumda küçük bir kenarı olabilir (boş tip),
- kullanın
struct .
Not: Alıcıları kullanıyorsanız, boş üs kandırmasını, müşteriler de olduğu gibi bilmek zorunda kalmadan kullanabilirsiniz struct Thing: Empty { std::string name; }; Bu yüzden Kapsülleme , ilgileneceğiniz bir sonraki konu.
std::pairolan bir yapı.