hae*_*lix 0 c++ memory byte void pointer-arithmetic
它似乎std::byte已经成为(在 C++17 中)处理保存对象表示的缓冲区的方式,但目前尚不清楚这种意图是否仍然允许执行指针算术。
标题中的问题是故意措辞应该的,因为我正在寻找推荐。例如,void*可以作为 gcc 扩展用于指针算术,但不是标准的(至少对于 C是这样),因此可能但不是推荐。
我知道的动机std::byte是将字符和数字方面与byte的概念分开。但与此同时,指针算法是否会留下来?
编辑:调整以澄清我希望使用std::byte*不使用std::bytes 中的指针存储的数值进行“指针算术”
是的,std::byte*可用于指针运算。
你甚至可以做这样的事情
struct foo{int x,y};
foo f;
int* ptr_to_y = reinterpret_cast<int*>(reinterpret_cast<std::byte*>(&f)+offsetof(foo,y));
Run Code Online (Sandbox Code Playgroud)
您必须注意您的位置是否可以通过您的操作到达。仅仅因为指针作为整数得到正确的结果并不意味着 C++ 代码正在执行定义的行为。在 C++ 中有许多关于允许优化器“知道”某个值不能被修改的怪癖。
struct loc {
int x,y;
};
void f( int* );
loc work( loc l ) {
l.x=3;
f(&l.y);
return l;
}
Run Code Online (Sandbox Code Playgroud)
在上述情况下,使用&l.y指针进行指针运算(内f)和修改的人l.x,无论他们是否去std::byte*,都会做未定义的行为。允许编译器假定返回l的.x值为3。
这些不是由std::byte*.