单个共享内存中的不同类型

时间:2012-03-21 12:47:40

标签: c++ c shared-memory

将uint32_t,uint8_t连续存储在共享内存中的最佳方法是什么? 即如果我们将uint32_t表示为a而将uint8_t表示为b,我希望将其存储在共享内存中

ababababababababababababab

这样做的最佳方式是什么?我应该使用void *然后在每次写共享内存时对其进行类型转换吗?或者有更简单的方法吗? 当我想在以后浏览共享内存时,Typecasting会产生并发症吗?

3 个答案:

答案 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_aread_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));