将uint32_t,uint8_t连续存储在共享内存中的最佳方法是什么?
即如果我们将uint32_t
表示为a
而将uint8_t
表示为b
,我希望将其存储在共享内存中
ababababababababababababab
这样做的最佳方式是什么?我应该使用void *然后在每次写共享内存时对其进行类型转换吗?或者有更简单的方法吗? 当我想在以后浏览共享内存时,Typecasting会产生并发症吗?
答案 0 :(得分:2)
一个打包结构的数组听起来像是一个不错的选择,不需要任何转换。
答案 1 :(得分:1)
如果必须打包数据,那么显而易见的是使用特定于实现的编译指示来打包结构,从而避免填充。如果你不想这样做(为什么不呢?),那么这样的事情会:
typedef uint8_t (*Thingy)[sizeof(uint32_t) + 1];
static inline uint32_t read_a(Thingy t) {
uint32_t val;
memcpy(&val, t, sizeof(uint32_t));
return val;
}
static inline void write_b(Thingy t, uint8_t val) {
reinterpret_cast<uint8_t*>(t)[sizeof(uint32_t)] = val;
}
显而易见的是write_a
和read_b
。
从这四个片段开始,您可以根据品味在C ++中创建更多对象。我输入Thingy
作为指向数组的指针,以便++
和+ n
执行迭代器所期望的操作,但不能只指定{{1}就像使用迭代器一样。您也可以编写一个保留*thingy
数据成员的类,重载必要的运算符以实现相同的操作,然后通过成员函数或代理对象进行读写。
对于它的价值,uint8_t*
存在的事实意味着必然uint8_t
。因此,如果你有其他地方的常量,例如sizeof(uint32_t) == 4
,那么你可以便携地使用它。
答案 2 :(得分:0)
创建一个大小为sizeof(a) + sizeof(b)
的共享内存段,并将每个值存储在另一个之后:
memcpy(shm, &a, sizeof(a));
memcpy(shm + sizeof(a), &b, sizeof(b));