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

时间:2018-10-11 13:35:02

标签: c++ memory byte void pointer-arithmetic

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

标题中的问题故意用应该表示,因为我在寻找推荐。例如,void*可以作为gcc扩展用于指针算术,但不是标准的(至少是true for C),因此有可能是not a recommendation

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

编辑:经过调整,以澄清我要使用std::byte*而不是存储在std::byte s中的指针的数值进行“指针算术”

1 个答案:

答案 0 :(得分:4)

是的,std::byte*可用于指针算术。

您甚至可以做类似的事情

struct foo{int x,y};
foo f;
int* ptr_to_y = reinterpret_cast<int*>(reinterpret_cast<std::byte*>(&f)+offsetof(foo,y));

您必须注意,通过操作可以到达您的位置。仅仅因为指针作为整数获得正确的结果并不意味着C ++代码正在执行已定义的行为。在C ++中,有很多怪异之处在于允许优化器“知道”某些值无法修改。

struct loc {
  int x,y;
};

void f( int* );

loc work( loc l ) {
  l.x=3;
  f(&l.y);
  return l;
}

在上述情况下,使用&l.y指针进行指针算术(在f内)并修改l.x的人,无论他们是否去过std::byte*或不,将做未定义的行为。允许编译器假定返回的l的{​​{1}}值为.x

这些不是3引入的新陷阱。