std::byte 指针是否应该用于指针运算?
Should std::byte pointers be used for pointer arithmetic?
似乎 std::byte
已成为(在 C++17 中)使用包含 object 表示的缓冲区的方式,但尚不清楚此意图是否仍允许执行指针运算。
标题中的问题故意表述为应该,因为我正在寻找推荐。例如,void*
可以作为 gcc 扩展用于指针运算,但不是标准的(至少这是 true for C), hence a possibility but not a recommendation.
我知道 std::byte
的动机是将字符和数字方面从 byte 的概念中分离出来。但与此同时,指针运算是否保留?
编辑:进行了调整以澄清我希望使用 std::byte*
来执行 "pointer arithmetic" 而不是 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++ 中有许多关于允许优化器 "know" 无法修改特定值的怪癖。
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*
引入的新陷阱。
似乎 std::byte
已成为(在 C++17 中)使用包含 object 表示的缓冲区的方式,但尚不清楚此意图是否仍允许执行指针运算。
标题中的问题故意表述为应该,因为我正在寻找推荐。例如,void*
可以作为 gcc 扩展用于指针运算,但不是标准的(至少这是 true for C), hence a possibility but not a recommendation.
我知道 std::byte
的动机是将字符和数字方面从 byte 的概念中分离出来。但与此同时,指针运算是否保留?
编辑:进行了调整以澄清我希望使用 std::byte*
来执行 "pointer arithmetic" 而不是 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++ 中有许多关于允许优化器 "know" 无法修改特定值的怪癖。
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*
引入的新陷阱。