gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:37:12 25 4
gpt4 key购买 nike

好像std::byte已成为(在 C++17 中)使用包含对象表示的缓冲区的方式,但尚不清楚此意图是否仍允许执行指针运算。

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

我知道 std::byte 的动机是将字符和数字方面从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com