【问题标题】:The size in bytes of vector<bool> that store n bits in c++在 c++ 中存储 n 位的 vector<bool> 的字节大小
【发布时间】:2021-07-24 01:47:02
【问题描述】:

简短: 如何正确计算存储 n 位的std::vector&lt;bool&gt; 字节的内存空间?

std::vector<bool> vb(n, false);
int size_bytes = compute_space_memory_in_bytes(vb);

详情:
在我的算法中,我使用 vector&lt;bool&gt; 来存储 n 位。为了在实践中有效地测量它,我需要知道如何以字节为单位计算空间内存。 (理论上它只是 O(n) 位)。

有2点:

  1. 如果我们有std::vector&lt;int&gt;the solution from another answer 是:
    sizeof(std::vector&lt;int&gt;) + (sizeof(int) * MyVector.size())

  2. 由于vector 将每个布尔值存储到一个位中

一个潜在的优化涉及合并向量元素,以便每个元素占用一个位而不是 sizeof(bool) 字节。

因此,从 1 到 2,我的尝试解决方案是:

std::vector<bool> vb(100, false);
auto size_bytes = sizeof(vector<bool>) + vb.size()/8;
std::cout << "Hello, size = " << size_bytes << " bytes!\n";

对吗?

编辑:更明确(感谢@PaulMcKenzie 评论):
给定要在执行时确定的 n 位。我的问题是在 bool 的向量中存储 n 位所占用的空间是多少(精确或大约)?

std::vector<bool> vb;

// some processing to get n ..

vb.resize(n);

auto size_bytes = compute size of vb in bytes ???;

std::cout << "Hello, size = " << size_bytes << " bytes!\n";

【问题讨论】:

  • 您要解决的high-level problem 是什么? sizeof(std::vector&lt;bool&gt;) 是一个编译时值,无论您在运行时分配给它的 bool 数量如何,都不会改变。
  • “正确吗?” — 简而言之,不。这取决于几个因素。以字节为单位的向量大小(不仅仅是bool)完全由实现定义。你只能说它≥ 1,或≥元素数 / 8,以较大者为准(尽管实际上实现需要至少存储大小和容量,因此这些给出了更严格的下限)。跨度>
  • + vb.capacity()/8; 可能更准确一些。一堆实现在底层使用了类似 int[] 的东西,因此它们至少会以 32 个元素的增量更改分配的内存。但即使这样也不完全准确,因为它没有考虑小缓冲区优化
  • @ibra -- 查看底层源代码,看看它是如何实现的。您无法将自己的方式编码到解决方案中——同样,这是由实现定义的。
  • "我的问题是在 bool 的向量中存储 n 位所占用的空间(确切或近似)是多少?" -- 不,这是你的问题。如果您知道问题的答案,您的问题是可以解决的,而我们不知道那是什么。换句话说,你为什么想知道?闲散的好奇心是一个有效的答案,但如果您要解决一个具体的问题,它可以帮助我们给您一个有意义的答案。另见meta.stackexchange.com/questions/66377/what-is-the-xy-problem

标签: c++ vector boolean sizeof


【解决方案1】:

对于您重新提出的问题:

如何计算sizeof得到空间占用的答案

正如其他人指出的那样,vector 的不同实现可能会对您的问题产生不同的答案。

一般来说,布尔值“占用”的内存(以字节为单位)为:

int s = (n + 7) / 8;

如果您的实现使用 32 位或 64 位值将 bool 打包到向量中,则需要四舍五入到 32 或 64:

int s = (n + 31) / 32;

int s = (n + 63) / 64;

vector 的实例本身使用了一些内存(指向第一个元素的指针、元素数或指向最后一个元素的指针、容量等);正如@paulsm4 所说,在他的vector 实现中是40 个字节。

您可能还需要考虑已分配但尚未占用的内存。这也取决于实施。

总之,您绝对可以只说明您的向量将占用的最小尺寸。

【讨论】:

  • 在 32 的情况下(64 也是如此),(n + 31) / 32 给出了槽的数量,其中每个是 32 位;因此要找到我们需要乘以(32/8)的字节数;所以,res = ((n + 31) / 32)*(32/8)。如果 n=100*32,公式 (n + 31) / 32 给我们 100,即 100 个时隙(每个 32 位),因此字节数为 100*(32/8) = 400 字节。另外,正如您所说,我在最后添加 sizeof(vector),res = sizeof(vector) + ((n + 31) / 32)*(32/8) 。
  • 我们可以直接使用: ( ( nb_bits + (sizeof(size_t)*CHAR_BIT-1) ) / (sizeof(size_t)*CHAR_BIT) ) * (sizeof(size_t)) 更通用和直接落在使用的实现中,size_t 32 或 64 位。
  • @ibra - 我认为不能保证vector 将使用size_t 包装bool 元素。
  • 是的,我同意 :)。正如我在之前的评论中所说,您的回答给出了如何四舍五入以获得使用的数量。因此,最后我们需要乘以所用字大小的字节数,32 位为 4,64 位为 8。 + sizeof(vector).
猜你喜欢
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多