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

标签 c++ vector boolean sizeof

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

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将每个 boolean 值存储到一个位

  • One potential optimization involves coalescing vector elements such that each element occupies a single bit instead of sizeof(bool) bytes.


    因此,从 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 的 vector 中存储 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";
    

    最佳答案

    对于您重申的问题:

    How to compute the sizeof to get the answer of space occupied


    正如其他人所指出的,vector 的不同实现可能会对您的问题产生不同的答案。
    一般来说,您的 boolean 值“占用”的内存(以字节为单位)是:
    int s = (n + 7) / 8;
    
    如果您的实现使用 32 位或 64 位值将 bool 打包到 vector 中,则您需要四舍五入为 32 或 64:
    int s = (n + 31) / 32;
    
    或者
    int s = (n + 63) / 64;
    
    有一些内存是 vector 的实例本身使用(指向第一个元素的指针、元素数量或指向最后一个元素的指针、容量等);正如@paulsm4 所说,在他的 vector 实现中是 40 个字节。 .
    您可能还想考虑已分配但尚未占用的内存。这也取决于实现。
    总之,您绝对可以仅说明您的 vector 将占用的最小大小。

    关于c++ - 在 C++ 中存储 n 位的 vector<bool> 的大小(以字节为单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67338591/

    相关文章:

    c++ - 如何在给定指向它的指针的情况下从 vector 中删除元素 - C++

    c++ - 为什么我们可以push_back仅用range定义的子 vector ?

    c++ - friend 类声明

    java - 找到与方向无关的两个 vector 的交点

    C++ 没有函数模板的实例

    Delphi boolean 变量值

    c++ - boolean 值的排序

    c++ - 创建指向 vector<vector<bool>> 中元素的指针

    c++ - 如何检查使用 Aws::Transfer::Transfermanager 下载是否成功?

    c++ - 无法调试 C++ 代码中的字符串转换