问题描述
简短:
如何正确计算存储 n 位的 std::vector<bool>
字节内存空间?
std::vector<bool> vb(n,false);
int size_bytes = compute_space_memory_in_bytes(vb);
细节:
在我的算法中,我使用 vector<bool>
来存储 n 位。为了在实践中有效地衡量它,我需要知道如何以字节为单位计算空间内存。 (理论上它只是 O(n) 位)。
有两点:
-
如果我们有
std::vector<int>
,the solution from another answer 是: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";
正确吗?
编辑:更明确(感谢@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 个字节。
您可能还想考虑已分配但尚未占用的内存。这也取决于实现。
总而言之,您绝对可以仅说明您的向量将占用的最小大小。