这是C和C++的一个理论问题。
我有一个4x4矩阵类型,它的定义很简单:
typedef float Matrix44[16];
我也有很多方法将Matrix44
作为参数,例如:
bool matrixIsIdentity(Matrix44 m);
我还有一个自定义的内存分配方案,可以在堆上预先分配大面积的内存,然后手动管理预取内存的分配。因此,我用自己的实现替换/重载了malloc
/new
。问题是,自定义malloc
和new
本质上都返回指针,而不是对象。
通常,我会简单地做以下操作:
// 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*
,但是,由于这是理论上的,我想假设这不是一种选择。
因此,我的问题变成了:有没有一种方法可以像在Method 1 Line 1
中那样在C和/或C++中声明一个自动变量,但它是否遵循另一种分配方案(如在Method 2 Line 1
中)?
(我很感激这可能涉及到与编译器相关的讨论,但我没有添加相应的标签)
这是不可能的,自动变量是基于堆栈的。但是你可以在构造函数中做任何你想做的事情。因此,你的Matrix44将只是一个薄薄的包装,比如说,Matrix44Impl,它将指向你的"自定义"内存。
好吧,这并不是你所要求的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
上的取消引用和delete
上的运算符地址,这确实有点奇怪,但我不明白为什么它在语法/语义上是错误的。编译器也很好地接受了它,并且它"工作"了。
不过,我强烈建议不要做这种事。即使它"运作"得非常好,也会产生误导。代码应该看起来像它正在做的事情,它应该做它看起来像的事情。这个代码没有。
不应该要求(甚至可能!)将看起来像的东西交给delete
,而且可以说,做一些奇怪事情的代码即使"工作正常"也不会真正"工作"。