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点:
如果我们有std::vector<int>,另一个答案的解决方案是:
sizeof(std::vector<int>) + (sizeof(int) * MyVector.size())
由于向量将每个布尔值存储到单个位中
一种潜在的优化涉及合并向量元素,以便每个元素占用一位而不是 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)
对于您重申的问题:
如何计算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.
您可能还需要考虑已分配但尚未占用的内存。这也取决于实施。
总之,您绝对可以仅指定向量将占用的最小大小。