我对使用 C++ 还很陌生,还没有掌握该语言的所有复杂性和微妙之处。
什么是最便携、正确、安全在 C++11 中向任何类型的指针添加任意字节偏移量的方法?
SomeType* ptr;
int offset = 12345 /* bytes */;
ptr = ptr + offset; // <--
我在 Stack Overflow 和 Google 上找到了很多答案,但他们都提出了不同的建议。我遇到过的一些变体:
-
Cast to char * https://stackoverflow.com/q/6449935/146622:
ptr = (SomeType*)(((char*)ptr) + offset);
-
Cast to unsigned int
:
ptr = (SomeType*)((unsigned int)ptr) + offset);
-
Cast to size_t https://stackoverflow.com/a/14453183/146622:
ptr = (SomeType*)((size_t)ptr) + offset);
-
“的大小size_t
and ptrdiff_t
始终与指针的大小一致。因此,这些类型应该用作大型数组的索引,用于存储指针和指针算术。” -关于 size_t 和 ptrdiff_t http://www.codeproject.com/Articles/60082/About-size_t-and-ptrdiff_t在代码项目上
ptr = (SomeType*)((size_t)ptr + (ptrdiff_t)offset);
-
或者像以前一样,但是与intptr_t代替size_t https://stackoverflow.com/a/1464194/146622,它是有符号的而不是无符号的:
ptr = (SomeType*)((intptr_t)ptr + (ptrdiff_t)offset);
-
仅投射到intptr_t
, since offset
已经是一个有符号整数并且intptr_t is not size_t https://stackoverflow.com/a/1464194/146622:
ptr = (SomeType*)((intptr_t)ptr) + offset);
在所有这些情况下,使用旧的 C 风格转换是否安全,或者使用起来更安全或更便携static_cast
or reinterpret_cast
为了这?
我应该假设指针值本身是无符号的还是有符号的?
我会使用类似的东西:
unsigned char* bytePtr = reinterpret_cast<unsigned char*>(ptr);
bytePtr += offset;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)