【发布时间】:2013-04-11 04:47:24
【问题描述】:
std::list 在其实现中使用链表,链表中的每个元素有多大(减去有效负载)?
通过测试,在 windows 7 机器上使用 mingw(不是 mingw-64),每个元素占用 24 个字节,用于 int 的每个元素。
一个指向左边的指针和一个指向右边的指针只有 4+4=8 个字节!而一个 int 只有 4 个字节(由 sizeof(void*) 和 sizeof(int) 决定),所以我很好奇,多余的空间去哪儿了?
(测试涉及制作许多元素,查看程序的大小,制作更多元素并再次查看程序的大小,获取差异)
【问题讨论】:
-
推测:可能是一些字节对齐(填充)。
-
检查源代码或在调试器中启动并打印。
-
还有另一种方式:使用内存处理程序来跟踪程序使用的内存。然后创建一个新的
list<T>。保存分配的内存。将T附加到列表中。已用内存中的增量等于sizeof(list_node) + sizeof(T),因此从增量中减去sizeof(T)得到sizeof(list_node)。 -
根据gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00577.html,它只有 2 个指针和有效负载。但是,如果使用 64 位编译器将其编译到库中,则指针将为 8 个字节,并且将其四舍五入为 24 的 4 个字节填充听起来是正确的。无论如何,这是我的猜测。我应该杀死这个问题吗?
-
确保您在发布模式下进行测试。额外的空间可能是仅在调试模式下存在的安全功能。