2017-01-25 28 views
0

RAMの最適化の目的で、データをstd::array<char, N>として保存する必要があります。Nは配列の "templated size_t"サイズです。 私は、あらゆる種類のデータ(数値と文字)を含む膨大な量の "Line"オブジェクトを管理する必要があります。C++ doubleをcharに置き換えてstd :: arrayに置き換えます。

だから私のラインのクラスがある:

template<size_t NByte> 
class Line { 
public: 
    Line (std::array<char, NByte> data, std::vector<size_t> offset) : 
     _data(data), _offset(offset) {} 

    template<typename T> 
    T getValue (const size_t& index) const { 
    return *reinterpret_cast<const T*>(_data.data() + _offset[index]); 
    } 

    template<typename T> 
    void setValue (const size_t& index, const T value) const { 
    char * new_value = const_cast<char *>(reinterpret_cast<const char *>(&value)); 
    std::move(new_value, new_value + sizeof(T), const_cast<char *>(_data.data() + _offset[index])); 
    } 

private: 
    std::array<char, NByte> _data; 
    std::vector<size_t> _offset; 
}; 

私の質問は以下のとおりです。

  • セッターとゲッター機能を行うには良い方法はありますか?
  • これはメモリリークに対して堅牢ですか?
  • 生産/リリースでこのコードを使用する際に問題はありますか?

編集:それらの背後にある質問です:メモリ内のバイナリデータを扱うとセッターを通じて、最終的なユーザーのために、「人間が理解できる」インターフェースを提供し、ゲッタリングする他の方法はありますか?

+1

'getValue'と' setValue'関数は、いくつかの 'operator []'オーバーロードで置き換えられるようです。しかし、関数内のコードを「より良い」ものにするのに役立たないでしょう。一方で、最適化されたコードの欠点を学びました。これは通常恐ろしいことです。 –

+4

ちなみに、コードが正常に機能していて、そのコードの「レビュー」が必要な場合は、http://codereview.stackexchange.com/があります。 –

+0

@StoryTeller:私の側からのクリッキング:-( – Elendil

答えて

1

生産/リリースでこのコードを使用する際に問題はありますか?

はい、このコードはプラットフォームによって異なります。

データは、Big-EndianプラットフォームとLittle-Endianプラットフォームで別々に保存されます。

お互いに通信している(このデータを送受信する)場合は、両者が同じエンディアンのプラットフォームを使用していることを確認する必要があります。

+0

ありがとうございます!しかし私たちのコードは既知のプラットフォーム上で動作し、外部と通信することはありません。ファイルへのデータ – Elendil

+1

@Elendil:そして​​、このファイルがある時点で何らかの逆エンディアンシステムに渡されないようにするにはどうすればいいですか? –

+0

これはデータパイプラインの要件であるため、データセンターの正確なアーキテクチャそして、このコードは、決してそれらのデータセンターの側で実行されません。 – Elendil

関連する問題