【发布时间】:2014-01-07 20:47:45
【问题描述】:
我正在寻找一种方法来确定未命名结构的大小,因为我想显式计算填充。
我有一组具有共同总体布局的结构
struct Packet {
uint8_t AllocatorDebugInfo[ALLOC_SIZE /* constant across all structs */ ];
/* OPTIONAL */ uint8_t Padding[ /* Needs to be determined */ ];
uint8_t Header[HEADER_SIZE /* dependent on packet type */ ];
uint8_t Payload[PAYLOAD_SIZE /* constant across all structs*/ ];
};
我有以下要求:
- 我编写了一个特殊用途的分配器,它在数据包前面有调试信息。
- 我想要可交换的标头类型,同时保持所有数据包类型布局兼容的有效负载。
我正在尝试计算标题大小,如下面的代码所示:
typedef union {
struct { /* opaque */ } SmallHeader;
struct { /* opaque */ } MedHeader;
struct { /* opaque */ } LargeHeader;
} HeaderSizes;
HeaderSizes *p;
enum { SMALL_PADDING = sizeof(HeaderSizes) - sizeof(p->SmallHeader)) };
不幸的是内存很紧,我正在寻找避免全局指针的方法。
编辑:
显然尝试像这样计算可选填充是一个非常糟糕的主意。这只有在您意识到最大的结构将具有比预期更多的填充(零)时才有效。
enum { LARGE_PADDING = sizeof (HeaderSizes) - sizeof ((HeaderSizes*)0->LargeHeader) };
struct LargePacket {
uint8_t AllocDebug[ALLOC_SIZE];
uint8_t Padding[ LARGE_PADDING ]; /* will evaluate to 0 -- struct size 1 */
uint8_t Payload[ PAYLOAD_SIZE ]; /* off by 1 */
};
【问题讨论】:
标签: c