我有一个包含9个字节成员的结构。 struct的sizeof()返回10.我假设额外的字节是由填充引起的。 填充字节是否允许用于任何事情,或编译器是否“保留”它?即就程序而言,记忆永远消失了吗?
询问的原因是我的空间非常短,所以我使用其中一个成员使用位操作在一个字节中存储多个值。但是,如果从不使用填充字节,我可以通过使用额外的字节值代替填充字节来降低访问位操作字节中的至少一个值的复杂性,而不增加结构的整体大小。 但如果可能的话,我宁愿回收填充空间以用于其他变量。 TA
typedef struct node {
struct node * sibling, *child; // 2 * 2 bytes
char * name; // 2 bytes
handle callback; // 2 bytes
uint16_t properties; // 1 byte
} node; // total by members = 9 bytes
totalSizeOfnode = sizeof(node); //totalSizeOfNode = 10
答案 0 :(得分:4)
你的问题的答案是否定的,不会被使用。结构的成员通常对齐以最适合其运行的底层架构。
另一方面,大多数编译器都必须选择控制此打包,因此如果内存不足,可以告诉编译器将struct成员打包到字节边界。请注意,这可能会降低性能,因为CPU可能需要执行多次读取才能获得跨越字边界的成员。
答案 1 :(得分:1)
如果您更改结构以便不再需要填充或现在由适当大小的成员占用,则填充空间将来始终可用。
如果你考虑编译器的工作方式,那么这个空间就不可能“永远丢失”,因为编译器对源代码的使用方式没有记忆 - 它只知道它现在是怎样的。