3

MSB が設定されているときに数値として解釈される長整数を使用したいのですが、それ以外の場合はポインターとして解釈されます。それで、これは機能しますか、それとも C または C++ で問題が発生しますか?

これは 64 ビット システム上にあります。

明確さとより良い説明のために編集されています。

4

9 に答える 9

6

人々は以前にこのようなトリックを試みました。

長期的にはうまくいくことはありません。

単にそれをしないでください。

編集:より良いリンク- 以前はセットとして返されなかった「bit31」への参照を参照してください。設定できるようになると (RAM が 2 ギガ以上、あえぎ!) いたずらなプログラムが壊れてしまうため、人々がこのような策略を (とりわけ) 使用したため、この量のメモリが標準になったら、プログラムはこのオプションを選択する必要がありました。そして今、私の素敵で短くて要点への答えが長くなりすぎました:-)

于 2013-05-20T20:57:40.063 に答える
4

それで、これは機能しますか、それとも C または C++ で問題が発生しますか?

64ビットですか?コードを 32 ビット システムに移植できるようにしますか? long必ずしも 64 ビットである必要はありません。ビッグエンディアン対リトルエンディアン?(あなたのシステムがどれか知っていますか?)

さらに、絶望的な混乱。この情報を保存するために追加の変数を使用してください。そうしないと、これに関連する多くのバグが発生します。

于 2013-05-20T20:55:40.867 に答える
3

それはアーキテクチャに依存します。たとえば、x86_64アーキテクチャは現在 48 ビットのアドレス指定を使用しています。これは、必要に応じて 16 ビットを使用できることを意味します (これは、「ポインター パッキング」と呼ばれることもあります)。ただし、x86_64 アーキテクチャーの定義でも、将来の実装ではこの制限を完全な 64 ビットに引き上げることができます。その場合、多くのコードを変更しなければならない状況に陥る可能性があります。そのため、本当にそのようにする必要がある場合は、将来変更しやすいように、ポインターのパッキングを 1 か所に保管してください。他のアーキテクチャについては、自分で確認する必要があります。

于 2013-05-20T20:58:56.590 に答える
1

本当にスペースが必要な場合や、これらのものをたくさん保管している場合を除き、単純なユニオンを使用して、タグ フィールドを追加します。その道をたどる場合は、メモリがニーズに合わせて調整されていることを確認してください。

于 2013-05-20T21:07:35.490 に答える
1

boost.lockfreeboost::lockfree::detail::tagged_ptrから見てみましょう

最新の1_53ブーストで導入されたクラスです。ポインタと追加の 16 バイトを 64 バイト変数に格納します。

于 2013-05-20T21:03:48.163 に答える
0

問題の「64 ビット システム」が x86_64 の場合、はい、動作します。

于 2013-06-03T16:13:53.470 に答える