Leistung :
Es hängt davon ab, ob.
In Ihrem speziellen Fall wird es keinen Leistungsunterschied geben, da die beiden in ähnlicher Weise im Speicher angeordnet werden.
In einem ganz bestimmten Fall (wenn Sie eine leere Struktur als eines der Datenelemente verwenden) kann die std::pair<>EBO-Funktion (Empty Base Optimization) möglicherweise verwendet werden und eine geringere Größe als die entsprechende Struktur aufweisen. Und eine geringere Größe bedeutet im Allgemeinen eine höhere Leistung:
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";
}
Drucke: 32, 32, 40, 40 auf Ideone .
Hinweis: Mir ist keine Implementierung bekannt, die den EBO-Trick für reguläre Paare verwendet, er wird jedoch im Allgemeinen für Tupel verwendet.
Lesbarkeit :
Abgesehen von Mikrooptimierungen ist eine benannte Struktur jedoch ergonomischer.
Ich meine, map[k].firstist zwar nicht so schlimm, get<0>(map[k])ist aber kaum verständlich. Ein Kontrast, map[k].nameder sofort anzeigt, woraus wir lesen.
Umso wichtiger ist es, wenn die Typen untereinander konvertierbar sind, da ein versehentliches Vertauschen zu einem echten Problem wird.
Vielleicht möchten Sie auch mehr über strukturelle oder nominelle Typisierung lesen. Enteist ein spezifischer Typ, der nur von Dingen bearbeitet Entewerden kann, die es erwarten , und alles, was es bearbeitet, std::pair<std::string, bool>kann es bearbeiten ... selbst wenn das std::stringoder boolnicht das enthält, was es erwartet, weil std::pairkeine Semantik damit verbunden ist.
Wartung :
In Bezug auf die Wartung pairist das schlimmste. Sie können kein Feld hinzufügen.
tupleDiesbezüglich ist es besser, wenn Sie das neue Feld anhängen und auf alle vorhandenen Felder mit demselben Index zugegriffen wird. Das ist so unergründlich wie zuvor, aber zumindest müssen Sie sie nicht aktualisieren.
structist der klare Gewinner. Sie können Felder hinzufügen, wo immer Sie möchten.
Abschließend:
pair ist das Schlimmste von beiden Welten,
tuple kann in einem ganz bestimmten Fall eine leichte Kante haben (leerer Typ),
- verwenden
struct .
Hinweis: Wenn Sie Getter verwenden, können Sie den Trick mit der leeren Basis selbst anwenden, ohne dass die Clients darüber Bescheid wissen müssen struct Thing: Empty { std::string name; }. Aus diesem Grund ist Encapsulation das nächste Thema, mit dem Sie sich befassen sollten.
std::pairist eine Struktur.