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].first
ist zwar nicht so schlimm, get<0>(map[k])
ist aber kaum verständlich. Ein Kontrast, map[k].name
der 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. Ente
ist ein spezifischer Typ, der nur von Dingen bearbeitet Ente
werden kann, die es erwarten , und alles, was es bearbeitet, std::pair<std::string, bool>
kann es bearbeiten ... selbst wenn das std::string
oder bool
nicht das enthält, was es erwartet, weil std::pair
keine Semantik damit verbunden ist.
Wartung :
In Bezug auf die Wartung pair
ist das schlimmste. Sie können kein Feld hinzufügen.
tuple
Diesbezü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.
struct
ist 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::pair
ist eine Struktur.