ここに投稿された理由とは別に、別の1 バイナリ互換性もあります。ライブラリの作成者は、使用しているstd::string
実装と、それと同じメモリレイアウトを使用しているかどうかを制御できません。
std::string
テンプレートであるため、その実装はローカルSTLヘッダーから取得されます。ここで、標準と完全に互換性のある、パフォーマンスが最適化されたSTLバージョンをローカルで使用していることを想像してください。たとえばstd::string
、動的割り当てとキャッシュミスの数を減らすために、それぞれに静的バッファを挿入することを選択した場合があります。その結果、実装のメモリレイアウトやサイズは、ライブラリのものとは異なります。
レイアウトのみが異なるstd::string
場合、ライブラリからクライアントに渡されたインスタンスの一部のメンバー関数呼び出し、またはその逆は失敗し、どのメンバーがシフトされたかに依存します。
サイズが異なる場合、std::string
メンバーを持つすべてのライブラリタイプは、ライブラリとクライアントコードでチェックしたときに異なるsizeofを持つように見えます。メンバーに続くデータメンバーstd::string
もオフセットがシフトし、クライアントから呼び出された直接アクセス/インラインアクセサーは、ライブラリ自体のデバッグ時に「OK」に見えても、ごみを返します。
ボトムライン-ライブラリとクライアントコードが異なるstd::string
バージョンで再度コンパイルされた場合、それらはうまくリンクしますが、厄介で理解しにくいバグが発生する可能性があります。std::string
実装を変更する場合、STLからメンバーを公開するすべてのライブラリを再コンパイルして、クライアントのstd::string
レイアウトに一致させる必要があります。また、プログラマーは自分のライブラリーを堅牢にしたいので、std::string
どこでも公開されることはめったにありません。
公平のために、これはすべてのSTLタイプに適用されます。IIRCでは、メモリレイアウトが標準化されていません。