是否可以更改C/C++中自动变量的分配区域



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

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

typedef float   Matrix44[16];

我也有很多方法将Matrix44作为参数,例如:

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*,但是,由于这是理论上的,我想假设这不是一种选择。

因此,我的问题变成了:有没有一种方法可以像在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,而且可以说,做一些奇怪事情的代码即使"工作正常"也不会真正"工作"。

最新更新