【问题标题】:size in bytes of a vector of structs containing vector, C++包含向量的结构向量的字节大小,C++
【发布时间】:2017-09-03 07:56:45
【问题描述】:

我有一个数据结构,它是结构的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++ memory vector struct


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多