在编译时强制执行静态存储

Sam*_*all 6 c c++

我有一个结构,我想强制执行静态存储.这是DSP上的矢量类型,并且意外地在堆栈上声明它是导致堆栈溢出,性能问题或两者的用户的常见错误.据我所知,这是不可能的,但我很好奇,如果有其他人知道的更好.

用例示例:

static Vector64 v1;  // OK
static Vector64 v2;  // OK
static Vector64 result; // OK
result = v1 * v2; // OK

Vector64 v3; // I would like this to give a compile-time error
Vector64 v4;
result = v3 * v4;
Run Code Online (Sandbox Code Playgroud)

我的编译器是Clang/LLVM 3.2,编译器特定的属性是公平的游戏.

Gle*_*aum 2

由于 C 没有类,我几乎会排除这种情况。

一般来说,在 C++ 中,当您定义一个类时,您无法控制该类型的对象是否会static在堆栈上、堆上const或不在const数组或另一个类的成员中定义。这些是班级用户的选择。

有一些技巧可以让它远离堆(例如使用operator new),或仅在堆上(例如使用生成器模式),但这不是您想要的

我很想看看这是如何可能的,但在那之前,我很确定你不能。