我在使用 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_tptr = (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
为此更安全或更便携?
我应该假设指针值本身是无符号的还是有符号的?