【发布时间】:2020-06-18 13:35:27
【问题描述】:
在 C++ 中,有没有办法将我想要的布局“映射”到内存数据上,无需复制它?
即有一个void* buffer,我知道它的布局:
- byte1: uint8_t
- byte2-3: uint16_t
- byte4: uint8_t
我知道我可以创建一个结构,并将数据 memcpy 到结构中,然后我可以将值作为结构的字段。
但是有没有办法在不复制的情况下实现这一点?数据已经存在,我只需要获取一些字段,我正在寻找一种方法来帮助布局。
(我可以有一些static ints 用于内存偏移,但我希望有一些更通用的)。
即:我会有更多“布局”,并根据原始数据的类型映射适当的布局并访问仍指向原始数据的字段。
我知道我可以将结构指向数据,这很简单:
struct message {
uint8_t type;
};
struct request:message {
uint8_t rid;
uint8_t other;
};
struct response:message {
uint8_t result;
};
vector<uint8_t> data;
data.push_back(1); //type
data.push_back(10);
data.push_back(11);
data.push_back(12);
data.push_back(13);
struct request* ptrRequest;
ptrRequest = (struct request*)&data[1];
cout << (int)ptrRequest->rid; //10
cout << (int)ptrRequest->other; //11
但我想要实现的是有一个带有布局的地图,即:
map<int, struct message*> messagetypes;
但我不知道如何进行,因为放置需要一个新对象,而且如果地图只存储基指针,则转换也很有挑战性。
【问题讨论】:
-
我不确定这里的严格别名规则,但如果结构被正确打包,那么你可以将它转换为指向结构的指针。
-
@Someprogrammerdude 投射指向结构的指针当前是 UB:open-std.org/jtc1/sc22/wg21/docs/papers/2020/…