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