有没有办法告诉C永远不动态分配内存?

时间:2013-12-06 07:13:49

标签: c memory-management

我想编写一个内存为常量的C程序。它永远不会分配超过一定数量的内存。

int main(){
   int memory[512];
   int i = 5;
   i = i + 5;
   memory[50] = i;
};

请注意,在此示例中,i = 5i = i+5将分配内存。我想完全避免内部内存分配过程(我认为这有点慢)。有没有办法让C直接在我的内存阵列上分配它?

5 个答案:

答案 0 :(得分:3)

int memory[512];    int i = 5;

通过这样做你已经分配了内存。即使你没有在100之后填充元素,仍然会有可变内存的512个整体分配和变量i的1个整数。

如果您需要动态允许,可以查看malloc() or calloc()

答案 1 :(得分:2)

您应该将"which I believe is kind of slow"更改为"I am certain that it will not affect program speed"

答案 2 :(得分:1)

首先,本地(“堆栈”)变量的“分配”非常快,并且通常在编译函数的堆栈帧时在编译时发生。每个变量在运行时没有开销,这不是它的工作原理。

其次,如果你想避免让int i;之类的变量占用更多的堆栈空间,那么你必须避免在代码中使用该声明。

你可以使用你分配的“阻止”,但这会很痛苦:

int space[512];

space[0] = 5;
space[0] += 5;
space[50] = space[0];

以上内容复制了您对i的使用,而是在数组中手动​​“分配”space[0]。当然,上面的代码很可能会产生比只有i更简单的代码,这一切都是为了节省一个int的堆栈空间。

答案 3 :(得分:0)

仅使用全局声明的变量。

然而,由于其他明显的原因,这是不好的建议:https://stackoverflow.com/a/176166/694576

答案 4 :(得分:0)

int i = 5;i = i + 5;的可能分配成本为零。方法中的单个int变量只是没有任何可观的分配成本。编译器有几个选项:

  1. 它将尽可能在编译时进行算术并完全消除变量(memory[50] = 10;),这意味着在运行时分配和算术都没有成本。

  2. 尽可能将变量放入CPU寄存器(零分配成本但仍然需要时间进行算术运算)。

  3. 如果失败,它将为堆栈上的变量保留空间,其中包括将堆栈指针递减513*sizeof(int)个字节而不是512*sizeof(int)个字节。它仍然不会花费额外的时间。操作系统可能不得不为线程的堆栈获取额外的内存页,但这或多或少是一次性成本。