Производительность :
Это зависит.
В вашем конкретном случае не будет никакой разницы в производительности, потому что эти два будут аналогично размещены в памяти.
В очень конкретном случае (если вы использовали пустую структуру в качестве одного из элементов данных), она std::pair<>
может потенциально использовать Оптимизацию пустой базы (EBO) и иметь меньший размер, чем эквивалент структуры. А меньший размер обычно означает более высокую производительность:
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";
}
Отпечатки: 32, 32, 40, 40 на ideone .
Примечание. Мне неизвестно о какой-либо реализации, которая на самом деле использует трюк EBO для обычных пар, однако обычно он используется для кортежей.
Читаемость :
Однако, кроме микрооптимизации, именованная структура более эргономична.
Я имею в виду, map[k].first
это не так уж плохо, пока get<0>(map[k])
едва понятно. Контраст с map[k].name
которым сразу указывает на то, с чего мы читаем.
Это тем более важно, когда типы могут быть преобразованы друг в друга, поскольку их случайная замена становится реальной проблемой.
Вы могли бы также хотеть прочитать о Структурном против Номинального Печатания. Ente
это определенный тип, который может работать только с теми вещами, которые ожидают Ente
, все, с чем он может работать, std::pair<std::string, bool>
может воздействовать на них ... даже когда std::string
или bool
не содержит того, что они ожидают, потому что std::pair
с ним не связано никакой семантики .
Техническое обслуживание :
С точки зрения обслуживания, pair
это худшее. Вы не можете добавить поле.
tuple
В этом отношении лучше, если вы добавите новое поле, все существующие поля будут по-прежнему доступны по одному и тому же индексу. Что так же непостижимо, как и раньше, но, по крайней мере, вам не нужно идти и обновлять их.
struct
явный победитель. Вы можете добавлять поля везде, где хотите.
В заключение:
pair
худший из обоих миров,
tuple
может иметь небольшое преимущество в очень специфическом случае (пустой тип),
- использовать
struct
.
Примечание: если вы используете геттеры, то вы можете использовать пустую базовую уловку самостоятельно, чтобы клиенты не знали об этом, как в struct Thing: Empty { std::string name; }
; вот почему инкапсуляция - это следующая тема, о которой вам следует задуматься.
std::pair
Это на структуру.