5

这是 C 和 C++ 的理论问题。

我有一个 4x4 矩阵类型,它的定义非常简单:

typedef float   Matrix44[16];

我也有许多以 aMatrix44作为参数的方法,例如:

bool matrixIsIdentity(Matrix44 m);

我还有一个自定义的内存分配方案,在堆上预先分配了大面积的内存,然后我手动管理该预取内存上的分配。因此,我已经用我自己的实现替换/重载malloc/ 。new问题是,自定义mallocnew本质上都返回一个指针,而不是一个对象。

通常,我会简单地执行以下操作:

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

但是,第 1 行分配mat在堆栈上,而不是我希望的自定义​​内存区域。另一种选择是:

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

这里的问题是我将不得不在我的代码中乱扔解引用运算符。现在一种选择是重写所有要采用的方法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 回答