【发布时间】:2013-02-05 05:05:53
【问题描述】:
这是一个 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)?
(我很欣赏这可能涉及与编译器相关的讨论,但我没有为此添加标签)
【问题讨论】:
-
请不要误会,但我当然希望这是不可能的。如果它看起来不像一个指针,它的行为就不应该像一个指针。当然,在 C++ 中,事情并不总是那么明确,呵呵。
-
我想这首先取决于您使用的操作系统。我想您可以摆弄链接器以重新排列内存布局。但我还不确定……
-
你真的不应该把
Matrix44作为参数;这个很贵。将这些参数声明为const Matrix44&。这可能会降低您首先在堆上分配矩阵的愿望吗? -
您可以使用对对象的引用:Matrix44 &mmat = *myMalloc(...);
-
@bash.d,您如何使用链接器重新安排内存布局?栈帧、栈等都内置在编译器中。当您执行 Matrix44 a; 时,编译器会在堆栈上为 a 保留空间。所有这些都是在链接之前完成的。就像 OP 一样,我很好奇这是否有技巧。标准当然没有定义堆栈...
标签: c++ c memory-management stack local-variables