Ngoài những lý do được đăng ở đây còn có một lý do khác - khả năng tương thích nhị phân . Các nhà văn của thư viện không có quyền kiểm soát std::string
việc bạn đang sử dụng triển khai nào và liệu nó có bố cục bộ nhớ giống như của họ không.
std::string
là một mẫu, vì vậy việc triển khai nó được lấy từ các tiêu đề STL cục bộ của bạn. Bây giờ hãy tưởng tượng rằng bạn đang sử dụng một số phiên bản STL được tối ưu hóa hiệu suất, hoàn toàn tương thích với tiêu chuẩn. Ví dụ, bạn có thể đã chọn xâm nhập bộ đệm tĩnh trong mỗi bộ đệm std::string
để giảm số lần phân bổ động và bỏ lỡ bộ đệm. Do đó, bố cục bộ nhớ và / hoặc kích thước triển khai của bạn khác với thư viện.
Nếu chỉ có bố cục khác nhau, một số std::string
chức năng thành viên gọi các trường hợp được truyền từ thư viện đến máy khách hoặc cách khác có thể không thành công, phụ thuộc vào thành viên nào được thay đổi.
Nếu kích thước cũng khác nhau, tất cả các loại thư viện có std::string
thành viên sẽ xuất hiện có kích thước khác nhau khi được kiểm tra trong thư viện và trong mã máy khách. Các thành viên dữ liệu theo sau std::string
thành viên cũng sẽ được thay đổi và bất kỳ trình truy cập trực tiếp / truy cập nội tuyến nào được gọi từ máy khách sẽ trả về rác, mặc dù "trông ổn" khi gỡ lỗi chính thư viện.
Tóm lại - nếu thư viện và mã máy khách được biên dịch lại các std::string
phiên bản khác nhau , chúng sẽ liên kết tốt, nhưng nó có thể dẫn đến một số lỗi khó hiểu, khó hiểu. Nếu bạn thay đổi std::string
triển khai, tất cả các thư viện cho thấy các thành viên từ STL phải được biên dịch lại để phù hợp với std::string
bố cục của khách hàng . Và bởi vì các lập trình viên muốn thư viện của họ mạnh mẽ, bạn sẽ hiếm khi thấy được std::string
tiếp xúc ở bất cứ đâu.
Để công bằng, điều này áp dụng cho tất cả các loại STL. IIRC họ không có bố cục bộ nhớ nổi bật.