私は C++ を扱うのは初めてで、この言語の複雑さと機微をすべて把握していません。
C++ 11で任意の型のポインタに任意のバイトオフセットを追加する最も移植性が高く、正しく安全な方法は何ですか?
SomeType* ptr;
int offset = 12345 /* bytes */;
ptr = ptr + offset; // <--
Stack Overflow と Google で多くの回答を見つけましたが、それらはすべて異なることを提案しています。私が遭遇したいくつかの変種:
-
ptr = (SomeType*)(((char*)ptr) + offset);
にキャスト
unsigned int
:ptr = (SomeType*)((unsigned int)ptr) + offset);
-
ptr = (SomeType*)((size_t)ptr) + offset);
「 と のサイズは常にポインターのサイズ
size_t
とptrdiff_t
一致します。このため、これらの型は、大きな配列のインデックス、ポインターの格納、およびポインター演算に使用する必要があります。」- CodeProject のsize_t と ptrdiff_tについてptr = (SomeType*)((size_t)ptr + (ptrdiff_t)offset);
または、前のように、
intptr_t
代わりに を使用size_t
します。これは、署名されていないのではなく署名されています。ptr = (SomeType*)((intptr_t)ptr + (ptrdiff_t)offset);
はすでに符号付き整数であり、 ではない
intptr_t
ため、 にのみキャストします。offset
intptr_t
size_t
ptr = (SomeType*)((intptr_t)ptr) + offset);
そして、これらすべての場合において、古い C スタイルのキャストを使用することは安全ですか、それとも使用するのがより安全で移植性が高いstatic_cast
のreinterpret_cast
でしょうか?
ポインター値自体が署名されていないか署名されていると想定する必要がありますか?