std::byte 指针应该用于指针运算吗?

hae*_*lix 0 c++ memory byte void pointer-arithmetic

它似乎std::byte已经成为(在 C++17 中)处理保存对象表示的缓冲区的方式,但目前尚不清楚这种意图是否仍然允许执行指针算术。

标题中的问题是故意措辞应该的,因为我正在寻找推荐。例如,void*可以作为 gcc 扩展用于指针算术,但不是标准的(至少对于 C这样),因此可能但不是推荐

我知道的动机std::byte是将字符和数字方面与byte的概念分开。但与此同时,指针算法是否会留下来?

编辑:调整以澄清我希望使用std::byte*不使用std::bytes 中的指针存储的数值进行“指针算术”

Yak*_*ont 5

是的,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*.

  • @LightnessRacesinOrbit 是的,`byte*` 获得与 `char*` 相同的特殊处理,除了它没有“指向空终止字符串的指针”等双重含义(所以 `std::ostream&amp; &lt;&lt; std ::byte*` 不会像当时的时尚那样遍历内存寻找空字节)。并且你不能对 `byte` 进行非位数学运算,比如 `+2`,而不先将其转换为整数类型。我同意这个问题需要工作,但我坚信这就是他们要问的。 (2认同)