C++向量<vector>的布尔类型内存分配

4
在C++ STL中,vector<bool>类针对内存进行了优化,每个存储的bool只分配一位,而不是一个字节。每次我输出vector<bool> xsizeof(x),结果都是40字节,这是创建向量结构的大小。sizeof(x.at(0))总是返回16字节,这必须是为许多bool值分配的内存,而不仅仅是在零位置上的一个值。16字节覆盖了多少个元素?恰好是128个吗?如果我的向量元素数量更多或更少会怎样?
我想测量向量及其所有内容的大小。如何准确地做到这一点?是否有可用于查看每个变量分配的内存的C ++库?

3
你把“一个对象的大小”和“为一个对象分配的内存空间大小”混淆了。 - Drew Dormann
我理解它们的区别,只是不知道该使用什么来查找分配的内存。 - user3377716
1
这是一个难以定义的概念,因为一字节的内存可能没有明确定义的所有权。它可能属于多个变量,或者在其“拥有变量”被销毁后仍然保持分配状态 - Drew Dormann
1个回答

4
我认为没有标准的方法来做到这一点。 vector<bool> 实现只能给你关于它是如何工作的 reference 成员类型的信息,但是没有理由认为这与数据在内部实际存储的方式有任何相似之处;当你将迭代器解引用为容器时,你只是得到一个 reference 而已。
因此,你只能得到容器本身的大小,这没问题,但要获得数据占据的内存量,你必须检查你所使用的实现的标准库源代码,并从中推导出解决方案。不过,老实说,这似乎是想要的一个奇怪的事情。
实际上,使用 vector<bool> 本身就是件奇怪的事情。以上所有内容基本上就是为什么现在人们不赞成使用它:它几乎完全不兼容其他标准容器设置的约定……甚至包括其他 vector 特化设置的约定。

还有一个关于std::vector容量与大小的整体概念,因为它可能会为了性能原因分配比实际需要更多的内存。 - Cory Kramer
我正在寻找的是 sizeof(x) + sizeof(decltype(x)::value_type)*x.capacity()。这很有帮助。 - user3377716
@CoryKramer:确实如此,但我能想到的这个问题的唯一用例是分析容器使用了多少内存,而不管其中是否实际存储了任何内容。 - Lightness Races in Orbit
2
但这是非常错误的。在这里,decltype(x)::value_typebool,根据定义,这不是您实际要存储的内容(否则这一切有什么意义呢?) - Lightness Races in Orbit
那么,这个计算结果是不准确的,因为在内容中每个布尔值只有一个比特时,分配的内存量超过了一次。 - user3377716
1
@apoorvk:它给出了不准确的结果,因为它假装每个布尔值占用1字节。而你甚至不知道每个布尔值实际上只占用1位。总的来说,你什么都不知道。正如我所说,你必须检查你具体的实现。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接