gpt4 book ai didi

c++ - reinterpret_cast 从缓冲区输入

转载 作者:行者123 更新时间:2023-11-28 06:01:28 27 4
gpt4 key购买 nike

我想知道有没有一种不用大量复制就可以解决这个问题的好方法。

例如,假设我有一个字节缓冲区,我在其中保存了很多东西。我会正确地在其中保存 4 个字节的整数和 float 等。

现在,如果我的整数保存在缓冲区中的位置 0x0001,有没有办法创建一个 int* 并将其指向该位置?

我试过:

int* ptr = reinterpret_cast<int*>(&data.dataPtr);

dataPtr 是一个 const char*,其中 ofc 保存缓冲区中我的整数的地址。

在我的 cast ptr 保存了 dataPtr 的地址之后,当我取消引用 ptr 时,它打印了 dataPtr 的地址。我应该用 static_cast 还是 reinterpret_cast 再次转换以获得整数?

如果不遇到未定义的行为,这是否可能?

最佳答案

无法保证它能正常工作,但您可以让它在某些编译器和系统上正常工作。

首先,您可能想要转换 data.dataPtr 而不是 &data.dataPtr。你想指向由 data.dataPtr 指向的缓冲区,对吗?不是指向指针变量本身。其次,如果 dataPtrconst,那么您也应该将 ptr 设置为 const,以确保一定的安全性。所以我们有:

const int* ptr = reinterpret_cast<const int*>(data.dataPtr);

这仍然存在一些问题。

data.dataPtr 可能不会存储与 int 对齐的地址,在这种情况下它可能无法工作。有些系统支持未对齐的指针,有些则不支持。在那些这样做的人身上,它通常很慢。

data.dataPtr 可能没有存储足够的数据来构成 int

如果它到目前为止有效,int 的确切值将根据系统的字节顺序而有所不同。

有时使用系统或编译器特定的行为是可以接受的,但前提是您确切地知道自己在做什么以及为什么会起作用。

要以标准投诉方式执行此操作,您必须一个一个地获取字节并使用位移将它们组合成一个 int

您还应该注意指针别名。

关于c++ - reinterpret_cast 从缓冲区输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33204131/

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