在 C++ 中存储 n 位的 vector<bool> 的大小以字节为单位

问题描述

简短: 如何正确计算存储 n 位的 std::vector<bool> 字节内存空间?

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

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

有两点:

  1. 如果我们有 std::vector<int>the solution from another answer 是:
    sizeof(std::vector<int>) + (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";

解决方法

对于您重申的问题:

如何计算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 个字节。

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

总而言之,您绝对可以仅说明您的向量将占用的最小大小。