我想知道是否有一种很好的方法可以解决这个问题而不需要制作大量的副本。
让我们说比如我有一个字节缓冲区,我可以节省很多东西。我会正确地为那里的整数保存4个字节并浮动等。
现在如果我的整数保存在缓冲区的0x0001位置,有没有办法可以创建一个int *并将其指向该位置?
我试过了:
int* ptr = reinterpret_cast<int*>(&data.dataPtr);
和dataPtr是const char*
,它将地址保存到缓冲区中的整数。
在我的cast ptr保存dataPtr的地址后,当我取消引用ptr时,它会打印dataPtr的地址。我应该使用static_cast或reinterpret_cast再次使用它来获取整数吗?
如果没有遇到未定义的行为,这是否可能?
答案 0 :(得分:1)
无法保证这是有效的,但您可以使其适用于某些编译器和系统。
首先,您可能想要投射data.dataPtr
而不是&data.dataPtr
。你想指向data.dataPtr
指向的缓冲区,对吗?不是指针变量本身。其次,如果dataPtr
为const
,那么您也应该ptr
const,以确保安全。所以我们有:
const int* ptr = reinterpret_cast<const int*>(data.dataPtr);
这仍有一些问题。
data.dataPtr
可能无法存储与int
对齐的地址,在这种情况下,它可能无效。有些系统支持未对齐的指针,有些系统不支持。在那些做的事情上,它往往很慢。
data.dataPtr
可能无法存储足够的数据来构成int
。
如果它到目前为止有效,int
的确切值将根据系统的字节顺序而有所不同。
有时可以使用系统或编译器特定的行为,但前提是您确切知道自己在做什么以及为什么会这样做。
要以标准投诉方式执行此操作,您必须逐个获取字节并使用位移将其组合为int
。
您还应该注意指针别名。