Hiệu suất :
Nó phụ thuộc.
Trong trường hợp cụ thể của bạn sẽ không có sự khác biệt về hiệu năng vì cả hai sẽ được đặt tương tự trong bộ nhớ.
Trong một trường hợp rất cụ thể (nếu bạn đang sử dụng một cấu trúc trống làm một trong các thành viên dữ liệu) thì std::pair<>
có khả năng có thể sử dụng Tối ưu hóa cơ sở trống (EBO) và có kích thước thấp hơn tương đương với cấu trúc. Và kích thước thấp hơn thường có nghĩa là hiệu suất cao hơn:
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";
}
Bản in: 32, 32, 40, 40 trên ideone .
Lưu ý: Tôi không biết về bất kỳ triển khai nào thực sự sử dụng thủ thuật EBO cho các cặp thông thường, tuy nhiên nó thường được sử dụng cho các bộ dữ liệu.
Dễ đọc :
Tuy nhiên, ngoài tối ưu hóa vi mô, một cấu trúc được đặt tên là tiện dụng hơn.
Ý tôi là, map[k].first
nó không tệ trong khi get<0>(map[k])
hầu như không thể hiểu được. Tương phản với map[k].name
điều đó ngay lập tức chỉ ra những gì chúng ta đang đọc từ.
Tất cả đều quan trọng hơn khi các loại có thể chuyển đổi lẫn nhau, vì việc hoán đổi chúng vô tình trở thành mối quan tâm thực sự.
Bạn cũng có thể muốn đọc về Kết cấu và Đánh máy danh nghĩa. Ente
là một loại cụ thể chỉ có thể được vận hành bởi những thứ mong đợi Ente
, bất kỳ thứ gì có thể hoạt động std::pair<std::string, bool>
đều có thể hoạt động trên chúng ... ngay cả khi std::string
hoặc bool
không chứa những gì họ mong đợi, vì std::pair
không có ngữ nghĩa liên quan đến nó.
Bảo trì :
Về mặt bảo trì, pair
là tồi tệ nhất. Bạn không thể thêm một trường.
tuple
hội chợ tốt hơn trong vấn đề đó, miễn là bạn nối thêm trường mới, tất cả các trường hiện có vẫn được truy cập bởi cùng một chỉ mục. Điều này không thể hiểu được như trước đây nhưng ít nhất bạn không cần phải cập nhật chúng.
struct
là người chiến thắng rõ ràng. Bạn có thể thêm các trường bất cứ nơi nào bạn cảm thấy thích nó.
Cuối cùng:
pair
là tồi tệ nhất của cả hai thế giới,
tuple
có thể có một cạnh nhẹ trong một trường hợp rất cụ thể (loại trống),
- sử dụng
struct
.
Lưu ý: nếu bạn sử dụng getters, thì bạn có thể tự sử dụng thủ thuật cơ sở trống mà không cần khách hàng phải biết về nó như trong struct Thing: Empty { std::string name; }
; đó là lý do tại sao Encapsulation là chủ đề tiếp theo bạn nên quan tâm.
std::pair
là một cấu trúc.