这对于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*
,但是,由于这是理论上的,我想假设这不是一个选项。
因此,我的问题是:是否有方法像在C++中那样在C和/或Method 1 Line 1
中声明一个自动变量,但是它是否遵循替代分配方案(如Method 2 Line 1
)?
(我理解这可能涉及到与编译器有关的讨论,但我没有为此添加标记)
发布于 2013-02-20 01:03:00
不可能,自动变量是基于堆栈的。但是你可以在构造函数中做你想做的任何事情。因此,您的Matrix44只是一个很薄的包装器,比如Matrix44Impl,它将指向您的“自定义”内存。
发布于 2013-02-20 01:49:28
嗯,这并不是你想要的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
上的address-of运算符,这显然有点奇怪,但我不明白为什么它在语法/语义上是错误的。编译器也接受它,而且它“工作”。
不过,我强烈建议不要做这种事。即使它“运作得很好”,它也是误导人的。代码应该看起来像它正在做的事情,也应该像它看起来的那样做。这段代码没有。
看起来它存在于堆栈中的东西不应该是必需的(或者,甚至可能!)传递给delete
,并且可以说是做一些奇怪事情的代码并不真正“工作”,即使它“工作得很好”。
https://stackoverflow.com/questions/14975754
复制