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].first
o kadar da kötü değil get<0>(map[k])
, ancak anlaşılabilir bir durumdur. map[k].name
Hangi 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. Ente
yalnı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::string
bool
std::pair
Bakım :
Bakım açısından pair
en kötüsüdür. Bir alan ekleyemezsiniz.
tuple
Yeni 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.
struct
açı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::pair
olan bir yapı.