似乎std::byte
已经成为使用保存对象表示形式的缓冲区的方式(在C ++ 17中),但是尚不清楚此意图是否仍然允许执行指针算术。
标题中的问题是故意措辞的,因为我正在寻找建议。例如,void*
可以用作gcc扩展的指针算术,但不是标准的(至少是true for C),因此可能是not a recommendation。
我知道std::byte
的动机是将字符和数字方面与字节的概念分开。但是同时,指针算法是否仍然存在?
编辑:调整以澄清我要使用std::byte*
而不是std::byte
s中存储的指针的数值来进行“指针算术”
最佳答案
是的,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
的.x
值为3
。这些不是
std::byte*
引入的新陷阱。关于c++ - 应该将std::byte指针用于指针算术吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52761440/