2012-01-23 8 views
1

現在、適切なC++コードを作成しようとしています(小さなプロトタイプでは正常に動作しましたが、スタック上のクラスをインスタンス化します。ここでは、varはヘッダに定義されています。

私は最近、ヒープとスタックのインスタンス化(O m = new O()対O m())の違いを認識しました。

私はクラスを持っています。ここで、ヘッダーファイルはテーブル定義を保持する変数を定義しています。

ChunkLoader.hpp:

TablePartion * tablePartial_。

ChunkLoader.cpp:

ChunkLoader(){ta​​blePartial_ =新しいTablePartial(真、0、1)。 }

今私は、スタック上tablePartialをインスタンス化したいが、私は使用することはできません。 TablePartial tablePartial_(true, 0, 1);

私は全盲のですか?スタックにtablePartial_をどのように割り当てることができますか? または、それは完全に間違っています。コンストラクタの後に範囲外になり、解放されるため、コンストラクタで使用できません。しかし、私はスタック変数がパフォーマンスに優れていることを読んでいるので、私はスタックインスタンス化を使用したいと思っています(と赤くなってdelete)。

主な理由:可能であれば、スタックオーバーフローによりポインタを削除するように指示されました。 :)

+0

はあなたがスタックにすることによって何を意味するかを明確になります。このために、あなたはnewオペレータprivateを作ることができますか?ローカル変数を意味しますか、コンストラクタ初期化子を親クラスに渡すことについて話していますか?私は少し混乱しています。 – octopusgrabbus

+1

'tablePartial_'は' ChunkLoader'クラスのメンバーですか、それとも単純に関数の変数ですか、それともグローバルですか? –

+2

注意、 'O m();は変数とは関係ありません。それは関数宣言です。 – fredoverflow

答えて

7

「スタック上」または「ヒープ上」の用語を避けるべきですが、これは説明されている概念とは関係のない実装の詳細です。代わりに、automatic(スタックと多かれ少なかれ相関する)、dynamic(多かれ少なかれヒープと相関する)、static(多かれ少なかれグローバルと相関する)、およびthread (これはスレッド固有のグローバルです)。あなたの特定の質問への答えで

、あなたの変数を初期化するためにコンストラクタの初期化子を使用することができます。

あなたがC++で「新しい」という言葉を使用していない場合は
ChunkLoader() 
    : tablePartial_(true, 0, 1) 
{ 
} 
+1

私は最初の段落に同意しませんが、私は正しい解決策をupvote – log0

+1

* shrug *最初の文は私ですスタックを持たないシステムでも、C++コードをうまく動かすことができます。そのようなシステム(スタックレス仮想マシン)のためにC-ishコンパイラをプログラムしました。 – Blindy

+0

これは実際には間違っています。もしあなたが 'ChunkLoader * p = new ChunkLoader'を実行すると、' p'はヒープ上にあり、 'tablePartial_'も同様になります。 –

0

(回避mallocと他のC/OSコールこの会話では、 "ヒープ"に動的にメモリを割り当てていません。

main()で作成したすべてとそこで呼び出される関数は、newが使用されていない場合はスタックになります。新しい関数呼び出しを入力すると、新しいスタックフレームを取得し、すべての変数はそうのように宣言:

void foo() { 
    int x; 
    std::string y; 
} 

はスタック上に作成されます。

あなただけのヒープオブジェクトへのポインタのような多形にそれを使用することができますので、あなたも、スタックベースのオブジェクトへの「ポインタ」を得ることができます

//These should be "classes" with private/public hiding but I'm being lazy. 
struct MyClass { 
    int x; 
    virtual void foo(); 
}; 

//These should be "classes" with private/public hiding but I'm being lazy. 
struct MyClassDerived : MyClass { 
    void foo() { std::cerr << "foo called!" << std::endl; } 
}; 

int main() { 
    MyClassDerived x; 
    MyClass* = &x; 
    x->foo(); 
} 
1

クラス宣言があるので:

class MyClass 
{ 
    SomeOtherClass x; 
}; 

xMyClassに完全に含まれています(SomeOtherClassへのポインタではありません)。

エルゴスタック上のオブジェクトMyClassを作成するときに、xもスタックになり、ヒープ上のオブジェクトMyClassを作成するとき、xもヒープになります。

EDIT:

私はそれを理解できるように、あなたはスタック上にxを割り当てたいです。これを行うには、MyClassのインスタンスもスタック上に存在する必要があります。

class MyClass 
{ 
    SomeOtherClass x; 
private: 
    void* operator new(size_t); 
}; 
+0

下垂体にコメントしてください。 –

+0

これは本当に私の答えではありませんでしたが、私の質問では重要な誤解を明確にしました。 ChunkLoaderは潜在的に非常に大きなデータ量(数十から数百メガバイト)を保持しています。私が知る限りでは、これはスタック上でのインスタンス化を不適格とする。 私はあなたが正しく理解すると、所有するオブジェクトがヒープ上にあるときに、すべてのクラス変数がヒープになります。 ChunkLoaderはヒープになるので、tablePartial_を気にする必要はありません。 ? – Bouncner

+0

@Bouncner: 'tablePartial_'はメンバーであり、' ChunkLoader'がどこにでもあります。これは文字通り 'ChunkLoader'の一部です。あなたの胃のようにあなたの一部です。あなたはそれがどこであるか心配するべきではありません。 –

関連する問題