原始数据的指针算法

时间:2013-07-30 16:22:39

标签: c serialization mpi void-pointers pointer-arithmetic

所以我必须处理一些结构数据,我必须以一种奇怪的方式压缩MPI_Send / Recv。

没有办法轻松地将它转换为指向我想要操作的已知类型的指针然后索引(因为我已经将结构压缩成连续的数据,不能假设对齐),所以我必须通过指针算法来完成它。问题是,为了与MPI保持一致,这个数据以void *的形式给出,而void *上的指针算法是非法的。

我的问题主要是风格:是否有更好的方法来执行此操作,而不是转换为char *然后执行指针算法?采取void *时的效率考虑因素是什么?去char *,做我的东西,然后再回到void *?我无法想象指针演员会非常昂贵。

G'day and thankee。

3 个答案:

答案 0 :(得分:3)

指针强制转换是完全免费的。做吧。

具有类型的指针是完全语言级别的概念。当你到达硬件级别时,指针只是一个恰好用作内存地址的整数。

在投射指针时必须小心严格别名,但我认为char *被定义为安全。

[好吧,有些情况下,在一些架构上,指针除了“只是整数”之外还有特殊处理,但你可能会忽略它们。还有一些ABI,其中不同的指针类型 不同(例如,FDPIC),但同样是其他人的问题。]

答案 1 :(得分:0)

你的解决方案很合理。很多时候我做过这样的事情:

void handle_raw(void* data) {
    // Use a uint8_t so pointer arithmetic is at a byte-level.
    uint8_t* p = data;    
    uint16_t value;

    // Read a 2-byte value at an arbitrary offset.
    value = *(uint16_t*)(p + 0x42);

    // Write a 2-byte value at an arbitrary offset.
    *(uint32_t*)(p + 0x12) = 0xDEADBEEF;
}

当然你应该使用常量作为偏移量,并执行适当的边界检查。

答案 2 :(得分:0)

你需要自己打包缓冲区有什么特别的原因吗?在MPI操作之前,您是否确实在连续缓冲区中压缩数据?如果是这样,您的压缩加传输时间必须低于简单地进行传输。如果是这种情况,那么我可以看出这是一个很好的理由。

如果您实际上只是为了MPI操作而打包在一个连续的缓冲区中,那么更好的解决方案就是自己停止打包数据,而是使用 MPI派生的数据类型

您可以使用类似“ MPI派生数据类型示例”的内容进行网络搜索,并获得比我在此处简要介绍的更好的解释。