【发布时间】:2015-06-23 07:07:08
【问题描述】:
我有以下结构:
struct SkipListNode{
void *data; // 8 bytes
uint8_t size; // 1 byte
// 7 bytes padding here...
void *next[1]; // dynamic array, 8 bytes each "cell"
};
我正在使用malloc(),我分配的空间比sizeof(SkipListNode) 多,所以我正在扩展next[] 数组。
我想避免7 bytes 浪费。我可以完全删除 size 字段,但是我应该在数组末尾保留单个 NULL(8 个字节)。但是,这无助于减小尺寸。
我应该使用__ attribute__((__ packed__)) 还是有其他方法可以解决问题?
这也必须在 C 和 C++ 下编译。
编译器是 gcc。
【问题讨论】:
-
你考虑过
#pragma pack(1) -
只是为了确保,打包结构的编译器指令对于不同的编译器是不同的。请同时指定编译器。
-
@Nick 是正确的,但我会给操作系统一些管理它自己的资源的功劳。当您使用打包时,如果此结构可能的最小尺寸,则为实际尺寸。我相信 malloc 级别中的额外填充不会浪费(想想这样做的后果!),而是被重用于进一步的 malloc 调用。无论如何它很容易测试......只需使用 1000 个结构运行您的进程并查看它消耗了多少内存。最好在编写自己的分配器之前这样做
-
@Ishay:解压后的结构体中的内存被浪费了。添加它以便变量位于机器字(现在通常为 64 位)的“偶数”边界上。如果你打包这个,它通常用于跨机器边界传输,因为只有这样才知道真实的结构,vars一个接一个地紧挨着。这意味着,当您加载它们时,将会有(afaik)额外的操作来解决它。因此请注意,您正在用内存换取 CPU。只有在真的、真的、真的、必要时才应该打包。
-
@Lundin:不,它不支持灵活成员,这就是为什么 size 是 1 而不是 0 或只是 []。但是代码工作得很好,你只需要在分配时记住这个 1 。这甚至适用于 POD 类