如果我有这样的结构
struct MixedStructure{
char a;
short b;
int c;
char d;
};
填充将生效。
我想知道的是,通过网络发送这样的结构是否有问题。
我的意思是,由于填充,这个结构实际上有 12 个字节(而不是 8 个)。如果在另一端使用了另一种填充方案(或没有),会有什么影响?
如果我有这样的结构
struct MixedStructure{
char a;
short b;
int c;
char d;
};
填充将生效。
我想知道的是,通过网络发送这样的结构是否有问题。
我的意思是,由于填充,这个结构实际上有 12 个字节(而不是 8 个)。如果在另一端使用了另一种填充方案(或没有),会有什么影响?
如果您使用的是 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 */
};
我还建议使用上述显式宽度类型。
这不是你唯一的问题。你怎么知道 sizeof(int) 或 sizeof(short) 在构建该结构的两个盒子之间是一致的?
大多数编译器都有方法来指定固定大小的变量(即 uint32_t)。为了回答您的具体问题,大多数编译器也有指定包装的方法。
将结构覆盖到字节缓冲区是高性能网络编程中非常常见的习惯用法,但可能会充满危险。您还需要了解这个习语如何违反严格混叠以及什么是字节序。
我知道在非常高性能的情况下,这是最好的选择。只是要非常非常小心,并在所有可能一起通信的潜在主机之间进行非常好的测试。如果您不需要这种性能,请查看google 的协议缓冲区之类的东西,以一种非常高效的方式传输数据,让您避免了解打包/字节序等。