exc*_*bur 1 c++ linux pointers
什么是在C++中执行指针运算最干净的方法?我正在尝试将n字节添加到地址.
int *foo;
foo = static_cast<int*> (static_cast<unsigned int>(foo) + sizeof(T))
Run Code Online (Sandbox Code Playgroud)
之后你可以重铸并以不同的方式使用foo
char* somestr = reinterpret_cast<char*>(foo)
Run Code Online (Sandbox Code Playgroud)
这够好吗?现在我理解指针实现dosent保证所有指针(char*,int*)都实现相同的大小.所以不确定是否int*(应该是foo*)并且使用unsigned int进行数学运算是最干净的解决方案.此外,它必须兼容32位和64位.
没关系为什么我这样做.虽然不是那么不寻常.当您使用动态解释为不同类型的数据流(或字节池)时,您将遇到此问题.
Kon*_*lph 12
最简洁的指针运算方式不是通过字节数,而是强类型.不要将int数组视为其他内容,只是直接偏移:
int* next = foo + n;
Run Code Online (Sandbox Code Playgroud)
要么:
int* next = &foo[n];
Run Code Online (Sandbox Code Playgroud)
两者都优于您的铸造解决方案.
如果您使用字节缓冲区,请使用char*,而不是(从不!)int*.那是,
char* buffer = get_the_buffer();
// Pointer arithmetic uses sizeof(char) == 1
Run Code Online (Sandbox Code Playgroud)
如果你真的需要在非字节数组中逐字递增,首先要问问自己为什么要这么做.然后,转换char*并执行指针运算; 也不会投给int或者其他整数类型:
char* foo_buffer = reinterpret_cast<char*>(foo);
char* whatever = foo_buffer + n;
Run Code Online (Sandbox Code Playgroud)
而不是char你也可以使用unsigned char哪个可以说更有意义来表示字节,但对指针算术没有影响.但是要注意对齐:您不能再使用原始类型可靠地访问递增的指针.访问未对齐的内存是严格未定义的行为(= 坏!).在最好的情况下,它很慢.在最糟糕的情况下,它崩溃了.
不用说,所有这一切是非常低的水平.这种代码几乎没有用处.即使是低级库也应该优先使用C++标准库工具来实现这种代码,特别是指针算法的用途越来越少.