2011-10-25 8 views
2

structをクラスメソッドで宣言すると、そのメモリはどのように割り当てられますか?struct?たとえば:メソッドのローカル構造でデフォルトのコンストラクタを実行する必要があります

void Foo::Bar(void) 
{ 
    struct timeval a; 

    a.tv_sec = 1; 
    a.tv_usec = 0; 

    ... 
} 

はヒープに割り当てと呼ばれるデフォルトのコンストラクタとメモリを他のローカルデータ(intdouble、など)のように、スタック上に割り当てられた、またはされていますか?

structは次のように初期化されます:struct timeval a = {0, 0};

メソッドが非常に頻繁に呼び出され、できるだけ速くする必要があるので、構造体をクラスメンバにする方が良いかどうかを判断しようとしています。

答えて

4

他のローカルデータ(int、doubleなど)と同様にスタックに割り当てられるか、またはヒープに割り当てられるメモリと呼ばれるデフォルトのコンストラクタですか?

ローカルストレージ(スタック)に割り当てられます。
オペレータのnewバージョンのうちのどれかが新しいもの(配置が新しい場合を除く)が作成中に使用された場合にのみ、Freestore(ヒープ)上にオブジェクトが作成されます。
また、構造体オブジェクトは、それを囲む関数の範囲を超えて存続しません。 Freestore(Heap)オブジェクトは、明示的にdeleteを呼び出すまで持続します。

構造体/クラスのオブジェクトを作成するたびに、その構造体/クラスに対して適切なコンストラクタ(パラメータ型の一致による)が呼び出されます。あなたの場合は、オブジェクトを作成する際に引数を渡さないので、Defaultコンストラクタが呼び出されます。

structが次のように初期化された場合はどうでしょうか?struct timeval a = {0、0};

これは、依然としてローカルストレージを持つオブジェクトとして割り当てられます。

メソッドが非常に頻繁に呼び出され、できるだけ速くする必要があるため、構造体をクラスメンバにする方が良いかどうかを判断しようとしました。

ローカルストレージ(スタック)上のオブジェクトを作成する方がFreestore(ヒープ)上にオブジェクトを作成するよりも高速です。 あなたのケースでは、ヒープをまったく使用していません。

実際のプロファイリングでは、どのコード(ローカルの構造体またはクラスのメンバー)がパフォーマンス要件に適しているかを示す必要があります。

ただし、メンバーを作成する前に、その構造がクラスにどのように関係しているかを考慮してください。それはあなたのクラスにhas aの関係を持っていますか、それは単なるユーティリティ構造です。そのデザイン面も考慮する必要があります。

また、several restrictionsがローカル構造またはクラス内でアクセスできるので、それも念頭に置いてください。

+0

オブジェクトはユーティリティ構造です。なぜそれをローカルにしたいのですか? 「持っている」という関係はありません。残念ながら、これは埋め込みプラットフォーム用です。プロファイリングツールはすべての目的や目的に使用できないため、私はターゲット上のプロファイラでこれを実行することはできません。 – LordOphidian

+0

@LordOphidian:それはそれをローカル構造として持っています。 –

1

この例では、オブジェクトはスタックに割り当てられ、デフォルトコンストラクタが呼び出されます。

+1

そして、デフォルトのコンストラクタはおそらく些細なので、完全に最適化されてしまいます。 –

関連する問題