ポインターに対してビットマスクを実行できないと読みましたが、ポインターに対してビット単位の操作を実行できないのはなぜですか?
同じ効果を達成する方法はありますか?
同じことが C++ にも当てはまりますか?
ポインターに対してビットマスクを実行できないと読みましたが、ポインターに対してビット単位の操作を実行できないのはなぜですか?
同じ効果を達成する方法はありますか?
同じことが C++ にも当てはまりますか?
ビットごとのポインター操作を実行できない理由は、標準で実行できないと規定されているためです。標準がそう言っている理由は、ビットごとのポインター操作がほぼ普遍的に未定義または (せいぜい) 実装定義の動作になるためだと思います。したがって、加算のような単純な操作とは異なり、便利で移植可能なものは何もありません。
ただし、キャストを使用して回避できます。
#include <stdint.h>
void *ptr1;
// Find page start
void *ptr2 = (void *) ((uintptr_t) ptr1 & ~(uintptr_t) 0xfff)
C++ に関してreinterpret_cast
は、C スタイルのキャストの代わりに使用するだけです。
セマンティクスが十分に定義されていないため、許可されていません。確かにできますけどね。にキャストしuintptr_t
、操作を行ってから、ポインター型にキャストし直します。これは C++ でも機能します。
標準では、ポインターの表現方法と、特定のポインターがアドレス指定できる値の範囲についてほとんど要件を課していないため、ポインターに対してビット単位の演算子を使用することはできません。したがって、ポインターでこれらの演算子を使用することが何を意味するかについての定義はありません。
それにもかかわらず、ほとんどのマシンのほとんどのコンパイラは、メモリ アドレスの明白なマッピングをポインタの値として使用します。そして、それらのほとんどは、ポインタを整数型にキャストできるようにします。その後、値に対してビット単位の操作を実行したり、ポインターにキャストしたりすることもできます。しかし、それは厳密には移植可能ではなく、一般的に明確に定義されているわけでもありません。