2017-09-03 15 views
2

私は構造体の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のオーバーヘッドを無視:私は、次のコードを使用してこれを行うには

メモリ割り当て)?

答えて

2

ええ、それはかなり正しいです。しかし、私の意見では、型の明示的な言及を避けることが最善です(あなたがすでに行っている)、そして標準ループから名前付きアルゴリズムで生のループを置き換えます。

あなたは std::accumulate持っているC++ 14の場合

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; 
} 
関連する問題