5

インスタンス化するために大量のデータを必要とする C++ オブジェクトがあります。例えば:

  class object {
      public object() { 
          double a[] = { array with 1 million double element }; 
      /* rest of code here*/};
      private:
      /* code here*/    
  }

これで、データ (つまり、100 万個の倍精度数) が別のテキスト ファイルに保存されます。質問: 効率的な方法で "double a[]" の後に配置し、最終的にコードをコンパイルするにはどうすればよいですか? 実行時にファイルからデータを読み取りたくありません。オブジェクトでコンパイルしたい。解決策は何ですか?理想的には、データが現在存在する別のテキスト ファイルに格納され、上記の double a[] =..... のような割り当てもあることが望ましいです。

これは可能ですか?前もって感謝します!

4

3 に答える 3

10

何かのようなもの:

class object
{
  public
  object(){ double a[] = { 
     #include "file.h"
  }; 
   /* rest of code here*/};
  private:
  /* code here*/    
}

ただし、ファイルは正しくフォーマットされている必要があります。つまり、次のようなものが含まれています。

//file.h
23, 24, 40,
5, 1.1, 

通常、#includeディレクティブを使用してコンテンツをファイルに貼り付けることができます。virtualメソッドがほとんどの派生クラスで一般的である場合、そのように貼り付けられるのを見てきました。私は個人的にこのテクニックがあまり好きではありません。

于 2012-11-30T01:58:16.320 に答える
0

Luchian Grigore の答えはかなり正しいです。ただし、コンパイラはソースコード行の長さに制限を設けることができます。たとえば、 https://stackoverflow.com/questions/10519738/source-line-length-limitを参照してください

だからあなたのコンパイラを試してみてください。しかし、残念ながら、あなたの問題のより簡単な解決策は、ファイルから巨大なデータを読み取ることです。

于 2012-11-30T03:36:30.497 に答える
0

この設計の大きな問題の 1 つはint、スタック上の 100 万の s がおそらくスタックを吹き飛ばすことです。おそらく必要なのは、データ セグメント、またはバイナリ ファイルに保存され、実行時にロードできるある種のリソースにデータを配置することです。データの複数のコピーが必要な場合は、std::vector実行時に複製して、データがフリー ストア (ヒープ) にあることを確認します。不必要な偶発的な重複の可能性を減らすために (または参照の重複の可能性を減らすために) a shared_ptrto aを使用することさえあるかもしれません。std::arrayunique_ptr

私が言っているのは、4MB のデータではうまく再生できないということだけです。また、他の変数への 4MB 配列の参照の局所性は、最大の関心事ではありません。

コンパイルされたターゲット プラットフォームとフレームワークによっては、この種のデータをバイナリ リソースに詰め込む方法があります。私はマルチメガ ファイルに対して行ったことはありませんが、リソース ファイルに関するビジュアル スタジオのヘルプは次のとおりです。 aspx

「コード内のデータ」は、ロードを根本的に高速化するわけではないことに注意してください(ファイルシステムを1回トラバースして見つけることを除いて)。OS は依然としてバイナリをロードする必要があり、バイナリが大きいほどロードに時間がかかり、値の大きな配列は、個別のファイルと同じようにバイナリで多くのスペースを占有します。本当の利点は、それが実行可能ファイルに対して「誤って配置」される可能性があるファイルではないことですが、リソース フォーク/リソース ファイル/etc メソッドはそれを処理できます。

以下のコメントにあるように、static constデータ (およびグローバル データ) は、ヒープ (別名フリー ストア) とスタック (別名自動ストア) の両方とは異なるデータ セグメントにロードされる傾向があります。標準がそれを何と呼んでいるのか忘れました。関数内のローカル変数は、初期化順序に関して、またはグローバル非ローカル変数とはstatic異なる動作をすることを知っています (グローバル (またはそうでない) データは、開始前に完全に初期化されますが、ローカルは関数が初めて初期化されるときに初期化されます)。私の記憶が正しければ呼び出されます)。staticstaticmainstatic

于 2012-11-30T04:01:40.493 に答える