包含载体的构造矢量的字节中的大小,C

size in bytes of a vector of structs containing vector, C++

本文关键字:字节 包含载      更新时间:2023-10-16

i具有一个数据结构,该数据结构是结构的std::vector,其中每个结构还包含std::vector。我想预先计算代表整个结构所需的内存的上限。为此,在测试中,我想计算最终结构的内存要求,并将其与我的估计进行比较。

为此,我使用以下代码:

struct SequenceInfo {
    unsigned long num1;
    unsigned long num2;
    unsigned long vectorLength;
    std::vector<unsigned long> values;
};
// A vector of sequence data to represent all data
typedef std::vector<SequenceInfo> SequenceInfoVec;

void foo(SequenceInfoVec& vec)
{
    getVec(vec);
    std::size_t actualSize = sizeof(SequenceInfoVec);
    for (SequenceInfoVec::iterator it1 = vec.begin(); it1 != vec.end(); ++it1)
    {
        actualSize += sizeof(SequenceInfo) + 
                      sizeof((*it1).values[0]) * (*it1).values.size();
    }
    cout << "memory size of vec is: " << actualSize << endl;
}

这是计算数据结构内存要求的正确方法(无视小型OS开销以进行内存分配)?

是的,这是正确的。但是我认为,最好避免明确提及类型(您已经在一定程度上做到了),并用标准库中的命名算法替换原始循环。

对于C 14您有std::accumulate

void foo(SequenceInfoVec& vec)
{
    getVec(vec);
    auto actualSize = std::accumulate(begin(vec), end(vec), sizeof(vec),
                    [](auto prev, auto const& item) {
                      return prev + 
                             sizeof (item) +
                             sizeof(item.values[0]) * item.values.size();
                    }
    );
    cout << "memory size of vec is: " << actualSize << endl;
}

,由于您并不真正关心计算顺序,对于C 17,您甚至可以与std::reduce并行化计算:

void foo(SequenceInfoVec& vec)
{
    getVec(vec);
    auto actualSize = std::reduce(std::execution::par, begin(vec), end(vec), sizeof(vec),
                    [](auto prev, auto const& item) {
                      return prev + 
                             sizeof (item) +
                             sizeof(item.values[0]) * item.values.size();
                    }
    );
    cout << "memory size of vec is: " << actualSize << endl;
}