在 C++ 中存储 n 位的向量 <bool> 的大小(以字节为单位)

ibr*_*bra 5 c++ boolean vector sizeof

简而言之: 如何正确计算std::vector<bool>存储 n 位的内存空间(以字节为单位)?

std::vector<bool> vb(n, false);
int size_bytes = compute_space_memory_in_bytes(vb);
Run Code Online (Sandbox Code Playgroud)

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

有2点:

  1. 如果我们有std::vector<int>另一个答案的解决方案是:
    sizeof(std::vector<int>) + (sizeof(int) * MyVector.size())

  2. 由于向量将每个布尔值存储到单个位中

一种潜在的优化涉及合并向量元素,以便每个元素占用一位而不是 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";
Run Code Online (Sandbox Code Playgroud)

那是对的吗 ?

编辑:更明确(感谢@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";
Run Code Online (Sandbox Code Playgroud)

Vla*_*ein 3

对于您重申的问题:

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

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

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

int s = (n + 7) / 8;
Run Code Online (Sandbox Code Playgroud)

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

int s = (n + 31) / 32;
Run Code Online (Sandbox Code Playgroud)

或者

int s = (n + 63) / 64;
Run Code Online (Sandbox Code Playgroud)

自身的实例使用一些内存vector(指向第一个元素的指针、元素数量或指向最后一个元素的指针、容量等);正如 @paulsm4 所说,在他的vector.

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

总之,您绝对可以仅指定向量将占用的最小大小。