其他分享
首页 > 其他分享> > c – __attribute __((packed))替代

c – __attribute __((packed))替代

作者:互联网

考虑以下结构:

typedef struct __attribute__((packed)) a{
    int a1;
    int b2;
    char cArray[5];
    int c3;
} Mystruct;

现在在我的代码中,我这样做:

char source[50];
Mystruct mm;
//...
//initialization and other codes
//...
memcpy(&mm,source,sizeof(mm));

我试图从字符串填充结构(从文件更具体),因此我不想填充.但是认为包装也会影响性能.

所以我的问题是,还有其他方法可以实现我想要的吗?
是否可以使用c中的类的成员变量执行相同的操作(从字符串填充)?如果有,怎么样?

解决方法:

我强烈建议你购买并阅读Write Portable Code.你不想采取这种方法.不仅因为它不可移植(想想endianess问题),而且确实会影响性能和原子性(非对齐的32位访问在没有LOCK前缀的x86上不是原子的).这对marshal/unmarshal‌来说要好得多,尽管前面的工作要多一些.

编组/解组后面的想法是将数据从一种格式转换为另一种格式,然后再将它们转换回来.这就是像Google Protocol Buffers,ZeroMQ这样的框架,以及许多其他框架以便携方式传输数据.你基本上有专门的函数来获取你所说的“字符串”数据,然后解析它,验证它,然后将它分配到你的结构中.您会看到编组和序列化在许多情况下可以互换使用.

例如,在您的情况下,您可能拥有原型的函数:

int
unmarshal_mystruct(const char *data, MyStruct &m);

在内部,您将从数据中解析数据,并填充m.它确实变得乏味,这就是为什么这么多人使用框架的原因.

标签:c-3,packed,c,padding
来源: https://codeday.me/bug/20190725/1534822.html