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