包含向量,C++的结构向量的大小(字节)

问题描述:

我有一个数据结构,它是结构的std::vector,其中每个结构也包含一个std::vector。我想提前计算表示整个结构所需的内存上限。为此,在测试中,我想计算最终结构的内存需求,并将其与我的估算进行比较。包含向量,C++的结构向量的大小(字节)

要做到这一点,我使用下面的代码:

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