情報をポインターにマスクする-C ++(Boost.Intrusive)

ツヴァイシュタイン

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]

編集
0

コメントを追加

0

関連記事

分類Dev

Boost.Intrusive-一定時間のイテレータ

分類Dev

boost :: intrusive :: listを繰り返しながら消去する方法

分類Dev

コンパイル時間を短縮するためのboost :: intrusive_ptrクラスの前方宣言

分類Dev

クラステンプレート内のプライベートネストされたクラスにboost :: intrusive_ptrを使用する方法

分類Dev

C ++ Boost:コンストラクターの後にエンドポイントを初期化する

分類Dev

boost :: signals2でブーストスマートポインターとC ++ 11スマートポインターを混在させる

分類Dev

std :: functionまたはBoostを使用して、C ++でクラスメンバーポインタを実装するにはどうすればよいですか?

分類Dev

BOOST_PYTHON_MODULEマクロの外部でC ++インスタンスをPythonに渡す

分類Dev

Boost.Pythonを使用してC ++オブジェクトを参照/ポインターでPythonインタープリターに渡します

分類Dev

C#のタイムゾーン情報をJavaのタイムゾーン情報に変換する方法

分類Dev

cygwinのboost_pythonのc ++クラスをリンクする

分類Dev

Boost-Qtで作成されたC ++ PythonモジュールをPythonにインポートする

分類Dev

「BracedInitializerList」スタイルの文字列をC ++でトークン化します(Boostを使用しますか?)

分類Dev

C ++ Boost ASIOシンプル定期タイマー?

分類Dev

Boost.Pythonを使用してポインタを返すC ++関数を公開する

分類Dev

boost :: pythonがargvをC ++に渡す

分類Dev

boost :: pythonがargvをC ++に渡す

分類Dev

Boost C ++のエポックタイムトゥデート/タイムフォーマット

分類Dev

C ++でboost :: this_threadを中断する方法

分類Dev

C ++ Boost Graph:vf2_subgrap_iso.hppのコールバック関数vf2_print_callbackをカスタマイズする方法

分類Dev

C++ boost error

分類Dev

SQLコマンドを使用してC#でデータベースから情報を取得する

分類Dev

C ++ cmake&boost&armcrossコンパイル

分類Dev

C ++ Boost asioはデータサイズを取得しますか?

分類Dev

boost :: shared_ptr <T>を使用(およびエクスポート)するときのエラーC2562

分類Dev

Boost SpiritX3でスマートポインターに合成

分類Dev

c ++ 11でboost1.55をコンパイルする

分類Dev

boost :: bind'ed関数を受け入れる可能性のあるc ++関数ポインターを指定する方法

分類Dev

Eigen Mapクラス:効率的な方法でC配列をVectorXdポインターにマッピングする

Related 関連記事

  1. 1

    Boost.Intrusive-一定時間のイテレータ

  2. 2

    boost :: intrusive :: listを繰り返しながら消去する方法

  3. 3

    コンパイル時間を短縮するためのboost :: intrusive_ptrクラスの前方宣言

  4. 4

    クラステンプレート内のプライベートネストされたクラスにboost :: intrusive_ptrを使用する方法

  5. 5

    C ++ Boost:コンストラクターの後にエンドポイントを初期化する

  6. 6

    boost :: signals2でブーストスマートポインターとC ++ 11スマートポインターを混在させる

  7. 7

    std :: functionまたはBoostを使用して、C ++でクラスメンバーポインタを実装するにはどうすればよいですか?

  8. 8

    BOOST_PYTHON_MODULEマクロの外部でC ++インスタンスをPythonに渡す

  9. 9

    Boost.Pythonを使用してC ++オブジェクトを参照/ポインターでPythonインタープリターに渡します

  10. 10

    C#のタイムゾーン情報をJavaのタイムゾーン情報に変換する方法

  11. 11

    cygwinのboost_pythonのc ++クラスをリンクする

  12. 12

    Boost-Qtで作成されたC ++ PythonモジュールをPythonにインポートする

  13. 13

    「BracedInitializerList」スタイルの文字列をC ++でトークン化します(Boostを使用しますか?)

  14. 14

    C ++ Boost ASIOシンプル定期タイマー?

  15. 15

    Boost.Pythonを使用してポインタを返すC ++関数を公開する

  16. 16

    boost :: pythonがargvをC ++に渡す

  17. 17

    boost :: pythonがargvをC ++に渡す

  18. 18

    Boost C ++のエポックタイムトゥデート/タイムフォーマット

  19. 19

    C ++でboost :: this_threadを中断する方法

  20. 20

    C ++ Boost Graph:vf2_subgrap_iso.hppのコールバック関数vf2_print_callbackをカスタマイズする方法

  21. 21

    C++ boost error

  22. 22

    SQLコマンドを使用してC#でデータベースから情報を取得する

  23. 23

    C ++ cmake&boost&armcrossコンパイル

  24. 24

    C ++ Boost asioはデータサイズを取得しますか?

  25. 25

    boost :: shared_ptr <T>を使用(およびエクスポート)するときのエラーC2562

  26. 26

    Boost SpiritX3でスマートポインターに合成

  27. 27

    c ++ 11でboost1.55をコンパイルする

  28. 28

    boost :: bind'ed関数を受け入れる可能性のあるc ++関数ポインターを指定する方法

  29. 29

    Eigen Mapクラス:効率的な方法でC配列をVectorXdポインターにマッピングする

ホットタグ

アーカイブ