2014-01-07 60 views
1

我有一个9字节值的成员结构。该结构的sizeof()返回为10.我假设额外的字节是由于填充。 是否允许填充字节用于任何事情,还是编译器“保留”它?也就是说,就程序而言,内存是否永远丢失?填充结构内存使用情况

问题的原因是我的空间非常短缺,所以我使用位操作在一个字节中使用了其中一个成员来存储多个值。然而,如果填充的字节从未被另外使用,我可以通过在不增加结构的整体大小的情况下具有额外的字节值来代替填充的字节来降低访问位操纵的字节中的至少一个值的复杂度。 但如果可能,我宁愿回收填充的空间用于其他变量。助教。

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

您可以在结构的末尾添加一个“char”字段,并在其中存储任何您想要的内容。它不会改变'sizeof'或内存需求。但是你的田地长度真的很奇怪。 'sizeof uint_16t should == 2',并且,根据平台的不同,'sizeof void * should == 4 or 8' –

+3

为什么你认为uint16_t的大小是1字节? – urzeit

+0

它在我目前正在使用的uC上执行:) – Toby

回答

4

您的问题的答案是否定的,它不会被使用。一个结构体的成员通常对齐以最适合它所运行的底层体系结构。另一方面,大多数编译器将不得不选择控制这种打包,所以如果内存不足,可以告诉编译器将结构成员打包在一个字节边界上。请注意,这可能会降低性能,因为CPU可能需要执行多次读取以获取跨越单词边界的成员。

+0

提及编译器选项+1。 –

+1

我在嵌入式程序中使用了'#pragma pack(1)'。 –

+0

:(该编译指示不适用于我的平台) – Toby

1

如果您更改结构以使填充不再需要或现在被适当大小的成员占用,则填充空间将来总是可用。

如果你想到编译器的工作方式,那么这个空间就不会永远丢失,因为编译器没有记忆过去的源代码 - 它只知道它现在是怎么回事。

+0

啊,在我'永远失去'的时候,我的意思是程序的生命周期,即当程序运行并且字节被填充时,会有其他变量,结构,放在这些'备用'字节中? – Toby

+1

啊,没错 - 不会重用 - 因为如果你像填充结构的memset那样做了,它会被销毁。 –