5

これは、C と C++ の両方の理論的な問題です。

次のように非常に簡単に定義された4x4マトリックスタイプがあります。

typedef float   Matrix44[16];

Matrix44また、パラメーターとして aを取る多くのメソッドがあります。たとえば、次のようになります。

bool matrixIsIdentity(Matrix44 m);

また、ヒープに大きなメモリ領域を事前に割り当ててから、そのプリフェッチされたメモリの割り当てを手動で管理するカスタム メモリ割り当てスキームも用意しています。そのため、 malloc/newを独自の実装に置き換え/オーバーロードしました。問題は、 custommallocとの両方が、new本質的に、オブジェクトではなくポインターを返すことです。

通常、私は単に次のことを行います。

   // Method 1
1] Matrix44 mat = { ... };
2] bool res = matrixIsIdentity(mat);

matただし、1行目は、私が望むようにカスタムメモリ領域ではなく、スタックに割り当てられています。別の方法は次のとおりです。

    // Method 2
1]  Matrix44 *mmat = myMalloc(...);
1a] Matrix44 *nmat = new ...
2]  bool res = matrixIsIdentity(*mat);

ここでの問題は、逆参照演算子をコードに散らかさなければならないことです。1 つのオプションは、代わりにすべてのメソッドを書き直すことMatrix44*ですが、これは理論的なものであるため、それはオプションではないと想定したいと思います。

したがって、私の質問は次のようになります: のように C および/または C++ で自動変数を宣言する方法はありMethod 1 Line 1ますMethod 2 Line 1か?

これにはコンパイラ関連の議論が含まれる可能性があることを理解していますが、その効果のためにタグを追加していません

4

2 に答える 2

4

自動変数はスタックベースです。ただし、コンストラクター内でやりたいことは何でもできます。したがって、Matrix44は、「カスタム」メモリを指すMatrix44Implなどの薄いラッパーになります。

于 2013-02-20T09:03:00.567 に答える
2

まあ、それはあなたが求めるものと100%正確ではありませんが、参照を使用すると、あなたが望むものと同じように見え、私が正しく理解していれば、多かれ少なかれあなたが望むものと区別がつかないように動作します:

Matrix44& mmat = *new Matrix44(...);   // or *myMalloc() or whatever

mmat.Rotate(45.0);
bool res = matrixIsIdentity(mat);
...
delete &mmat; // or myFree(&mmat) or something similar

newの逆参照と、確かに少し奇妙である address-of 演算子に注意してくださいdelete。しかし、なぜそれが構文的/意味的に間違っているのかわかりません。コンパイラもそれを問題なく受け入れ、「機能します」。

ただし、そのようなことをしないことを強くお勧めします。たとえそれが完全にうまく「機能」したとしても、それは誤解を招くものです。コードは、実行しているように見える必要があり、そのように動作する必要があります。このコードはそうではありません。

スタック上に存在するように見えるものは、に渡す必要はありません (または、可能です!)。deleteまた、奇妙なことを行うコードは、たとえ「正常に動作する」としても、実際には「動作」しません。

于 2013-02-20T09:49:28.557 に答える