包含vector,C ++的结构向量的大小(以字节为单位)

时间:2017-09-03 07:56:45

标签: c++ memory vector struct

我有一个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开销)?

1 个答案:

答案 0 :(得分:2)

是的,这是非常正确的。但在我看来,最好避免明确提到类型(你已经在某种程度上做了),并用标准库中的命名算法替换原始循环。

对于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;
}