2

如果我有这样的结构

struct MixedStructure{
char a;
short b;
int c;
char d;
};

填充将生效。

我想知道的是,通过网络发送这样的结构是否有问题。

我的意思是,由于填充,这个结构实际上有 12 个字节(而不是 8 个)。如果在另一端使用了另一种填充方案(或没有),会有什么影响?

4

2 回答 2

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 */
};

我还建议使用上述显式宽度类型。

于 2012-09-06T15:25:07.223 回答
2

这不是你唯一的问题。你怎么知道 sizeof(int) 或 sizeof(short) 在构建该结构的两个盒子之间是一致的?

大多数编译器都有方法来指定固定大小的变量(即 uint32_t)。为了回答您的具体问题,大多数编译器也有指定包装的方法。

将结构覆盖到字节缓冲区是高性能网络编程中非常常见的习惯用法,但可能会充满危险。您还需要了解这个习语如何违反严格混叠以及什么是字节序

我知道在非常高性能的情况下,这是最好的选择。只是要非常非常小心,并在所有可能一起通信的潜在主机之间进行非常好的测试。如果您不需要这种性能,请查看google 的协议缓冲区之类的东西,以一种非常高效的方式传输数据,让您避免了解打包/字节序等。

于 2012-09-06T15:29:39.797 回答