4

私はC++を使い始めたばかりで(私は経験豊富なPython / Java開発者であり、OpenCLのより良い部分に取り組んでいます)、オブジェクトが関数に渡される方法に非常に混乱しています。

簡単なクラスがあるとしましょう。

class Thing {
    int var;
    int var2;
    int var3;

    void doSomething();
};

現在、このクラスの「サイズ」は少なくとも3*sizeof(int)です(関数ポインタが格納されているかどうかはわかりません)。ここで、2つの関数シグネチャがあるとします。

void doThing1(Thing t);
void doThing2(Thing* t);

を呼び出すとdoThing1、インスタンス全体がスタックにコピーされますか?を呼び出すと、スタックスペースdoThing2のみが必要ですか?sizeof(Thing*)

インターネット上にある多くの「従来の知識」は、の関数シグネチャを使用するように私に言ってきましたdoThing1が、一見すると非常にばかげているように見えます-それが実際にオブジェクト全体をコピーする場合。

また、関数が(newキーワードで作成された)ヒープ上にあるオブジェクトを変更しようとしている場合、それはのように見えるはずだと思いdoThing1ます。

私の無知を正してください。私のGoogle検索が役に立たないか、Googleが役に立たないかのどちらかです。

4

4 に答える 4

5

doThing1 を呼び出すと、インスタンス全体がスタックにコピーされますか? Ic all doThing2 の場合、sizeof(Thing*) スタック スペースのみが必要ですか?

はい、はい。

インターネット上に出回っている多くの「従来の知恵」は、doThing1 の関数シグネチャを使用するようにと言ってきました。

どこ?

呼び出し先で変更する 必要がある場合は、ポインターまたは参照を渡す必要があります。を変更する必要がない場合は、単に const 参照を渡す必要があります (参照渡しの効率で、値渡しの誤った状態の変更から保護されます)。ThingThing

void doThing(const Thing& t)
于 2012-07-11T19:13:40.080 に答える
3

doThing1を呼び出すと、インスタンス全体がスタックにコピーされますか?doThing2を呼び出すと、sizeof(Thing *)スタックスペースのみが必要ですか?

はい、そしてはい。

現在、このクラスの「サイズ」は少なくとも3 * sizeof(int)です(関数ポインターが格納されているかどうかはわかりません)。

関数ポインタは格納されません。サイズは3×sizeof(int)です。(デモ)

于 2012-07-11T19:11:47.700 に答える
2

どちらの場合も正しいです。参照を使用することもできます。これにより、コピーは回避されますが、ポインターも回避​​されます。

void doThing2(const Thing& t);

これは、コンパイラーによって簡単に最適化され、ミス (関数での再割り当てなど) を回避するのに役立つため、私の好みです。

于 2012-07-11T19:13:08.057 に答える
1

それらを const 参照で渡しますvoid doThing1( const Thing &t)

于 2012-07-11T19:13:41.973 に答える