0

必要なメモリ (行列、ベクトルなど) を効率的に事前に使用できるように、ライブラリの実行全体で計算される問題の最大サイズをできるだけ早く知るための強力なユース ケースがあるアルゴリズムを実装しました。 -割り当てられます。「できるだけ早く」は、C++ 静的初期化がトリガーされるときよりも早くまたは遅くないと定義されます。

  /**
   * Example of what I would like to accomplish but of course this 
   * System#getProperty is the Java way
   */
  class texample {
      static const int MAX_M_N;
  }

  const int texample::MAX_M_N = System.getProperty("maxMN");  // possible? how?

もちろん、代わりに動的な初期化と割り当てを使用してこれを行うこともできますが、これらの入力引数のプロパティが静的な初期化時に「見られる」場合は、はるかに簡単になります。その理由は、静的に初期化/割り当てられたラッパー オブジェクト インスタンスが静的破棄プロセスによっても破棄され、例外の処理や手動でのインスタンスの解放/削除などについて心配する必要がないためです。

更新: もう 1 つ :) 再コンパイルせずにこれを使用したいと思います。もちろん、マクロを使用できるので (私は CMake を使用しています)、CMakeList.txt ファイル内のマクロを変更して再コンパイルするのは非常に簡単ですが、実行時にサイズを動的に指定することをお勧めします。

4

1 に答える 1

1

環境からの読み取りが許容される場合は、これを試すことができます。

#include <cstdlib>

int readme(char const * envname)
{
    char * e, * env = std::getenv(envname);

    if (!env)
    {
        std::cerr << "Environment '" << envname << "' missing, aborting.\n";
        std::exit(0);
    }

    int res = std::strtol(env, &e, 0);

    if (*e != 0)
    {
        std::cerr << "Environment '" << envname << "' unparsable (contains '" << env << '"), aborting.\n";
        std::exit(0);
    }

    return res;
}

int const texample::MAX_M_N = readme("maxMN");  // #1

行「#1」は、ユーザー コードが初めて実行されるプログラムの動的初期化フェーズ中に実行され、mainが呼び出される前に完了することに注意してください。

于 2012-08-13T11:38:12.140 に答える