Boostで、メモリを節約するために情報をポインタにマスキングする方法について読みました(https://www.boost.org/doc/libs/1_72_0/doc/html/intrusive/set_multiset.html、optimize_size)。これはどのように可能ですか?ポインタは48ビットしか使用しないが、64ビット長であるため、ビットシフトを使用して情報を上位ビットにプッシュできることをどこかで読みました。あれは正しいですか?
なぜ彼らはrb-treesの色情報を格納するために整数を使用しているのですか?charsを使用する方が効率的ではないでしょうか。
Boostで、メモリを節約するために情報をポインタにマスキングする方法について読みました(https://www.boost.org/doc/libs/1_72_0/doc/html/intrusive/set_multiset.html、optimize_size)。これはどのように可能ですか?
答えはあなたが投稿したリンクにあります:
ポインターの配置が偶数の場合、フックは赤黒木ノードのカラービットを親ポインターに埋め込みます。
アラインメントが偶数の場合、ポインタ値の最下位ビットは常にゼロであり、カラービットを格納するために使用できます。ポインタまたは色をロードする必要があるときはいつでも、他のビットをクリアする必要があります。これにより、パフォーマンスにわずかな影響が加わりますが、その代わりに、ポインタに相当するフックのスペースが節約されます。ただし、実際には、パフォーマンスのオーバーヘッドは、CPUでの命令の並列実行によって隠されることがよくあります。
ポインタは48ビットしか使用しないが、64ビット長であるため、ビットシフトを使用して情報を上位ビットにプッシュできることをどこかで読みました。あれは正しいですか?
64ビットシステムでは、ポインターのサイズは64ビットですが、一部のシステムは全幅ポインターを実装せず、代わりにアドレス指定に使用するビット数を減らします。上位ビットが未使用の場合、特定の値(x86の1つ)を持つ必要があります。ウィキペディアには、x86を含むさまざまなCPUに関する概要が記載されています。アーキテクチャが異なれば制限も異なり、全幅の64ビットアドレス指定を実装するものもあります。したがって、上位ビットに追加データを格納することは可能ですが、すべてのアーキテクチャで可能であるとは限りません。また、クリアロジックはCPUアーキテクチャによって異なる場合があります。
なぜ彼らはrb-treesの色情報を格納するために整数を使用しているのですか?charsを使用する方が効率的ではないでしょうか。
Achar
は整数です。色情報は実際には1ビット(赤または黒のノード)です。他のビットにするかどうかchar
、またはint
、未使用です。あなたの質問に答えるために、aを使用するchar
方が効率的な場合もありますが、Boost.Intrusiveフックの場合はそうではありません。したがって、Boostoptimize_size
が有効になっている場合、Boostはこれらのタイプのどちらも色の保存に使用しません。有効になっていない場合、列挙型(通常はと同じサイズ)int
)はカラータグを格納するために使用されますが、配置のためにポインタに相当するスペースがフックに追加されるため、実際には問題ではありません。(追加されたパディングの一部は、ベースフックの場合に他の有用なデータに使用できますが、ノードバイナリレイアウトのフックの直後にある最初の非静的データメンバーの配置が小さい非常に特殊な場合に限ります。)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加