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::stringviệ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::stringlà 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::stringchứ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::stringthà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::stringthà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::stringphiê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::stringtriể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::stringbố 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::stringtiế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.