如果我有像
这样的结构 struct MixedStructure{
char a;
short b;
int c;
char d;
};
填充将生效。
我想知道的是,如果在网络上发送这样的结构时出现问题。
我的意思是,由于填充,这个结构实际上有12个字节(而不是8个)。如果在另一端使用另一个填充方案(或没有),那么会产生什么影响?
答案 0 :(得分:2)
如果您使用的是GCC,请使用__packed__
属性:
#define PACKED __attribute__((__packed__))
struct PACKED MixedStructure { ... };
如果您使用的是Windows,请使用pragma
:
#pragma pack(push, 1)
struct MixedStructure { ... };
#pragma pack(pop)
如果你想要对齐,你也可以使用显式填充:
#include <stdint.h>
#define PACKED __attribute__((__packed__))
struct PACKED MixedStructure {
int8_t a;
int8_t pad0; /* added for alignment */
int16_t b;
int32_t c;
int8_t d;
int8_t pad1[3]; /* added for alignment */
};
我还建议使用如上所述的显式宽度类型。
答案 1 :(得分:2)
这不是你唯一的问题。你怎么知道sizeof(int)或sizeof(short)在构建该结构的两个框之间是否一致?
大多数编译器都有指定fixed-size variables的方法(即uint32_t)。要回答您的具体问题,大多数编译器还可以指定packing。
将结构覆盖到字节缓冲区是高性能网络编程中非常常见的习惯用法,但可能会带来危险。您还需要了解这个习语如何违反strict-aliasing以及endianess是什么。
我知道在非常高性能的情况下,这是最好的选择。只是非常小心,并在可能通信的所有潜在主机之间进行非常好的测试。如果您不需要这种性能,请查看google's protocol buffers之类的内容,以便以相当高效的方式传输数据,以避免了解打包/结束/等。