MSB が設定されているときに数値として解釈される長整数を使用したいのですが、それ以外の場合はポインターとして解釈されます。それで、これは機能しますか、それとも C または C++ で問題が発生しますか?
これは 64 ビット システム上にあります。
明確さとより良い説明のために編集されています。
それで、これは機能しますか、それとも C または C++ で問題が発生しますか?
64ビットですか?コードを 32 ビット システムに移植できるようにしますか? long
必ずしも 64 ビットである必要はありません。ビッグエンディアン対リトルエンディアン?(あなたのシステムがどれか知っていますか?)
さらに、絶望的な混乱。この情報を保存するために追加の変数を使用してください。そうしないと、これに関連する多くのバグが発生します。
それはアーキテクチャに依存します。たとえば、x86_64アーキテクチャは現在 48 ビットのアドレス指定を使用しています。これは、必要に応じて 16 ビットを使用できることを意味します (これは、「ポインター パッキング」と呼ばれることもあります)。ただし、x86_64 アーキテクチャーの定義でも、将来の実装ではこの制限を完全な 64 ビットに引き上げることができます。その場合、多くのコードを変更しなければならない状況に陥る可能性があります。そのため、本当にそのようにする必要がある場合は、将来変更しやすいように、ポインターのパッキングを 1 か所に保管してください。他のアーキテクチャについては、自分で確認する必要があります。
本当にスペースが必要な場合や、これらのものをたくさん保管している場合を除き、単純なユニオンを使用して、タグ フィールドを追加します。その道をたどる場合は、メモリがニーズに合わせて調整されていることを確認してください。
boost.lockfreeboost::lockfree::detail::tagged_ptr
から見てみましょう
最新の1_53ブーストで導入されたクラスです。ポインタと追加の 16 バイトを 64 バイト変数に格納します。
問題の「64 ビット システム」が x86_64 の場合、はい、動作します。