我想编写一个内存为常量的C程序。它永远不会分配超过一定数量的内存。
int main(){
int memory[512];
int i = 5;
i = i + 5;
memory[50] = i;
};
请注意,在此示例中,i = 5
和i = i+5
将分配内存。我想完全避免内部内存分配过程(我认为这有点慢)。有没有办法让C直接在我的内存阵列上分配它?
答案 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
变量只是没有任何可观的分配成本。编译器有几个选项:
它将尽可能在编译时进行算术并完全消除变量(memory[50] = 10;
),这意味着在运行时分配和算术都没有成本。
尽可能将变量放入CPU寄存器(零分配成本但仍然需要时间进行算术运算)。
如果失败,它将为堆栈上的变量保留空间,其中包括将堆栈指针递减513*sizeof(int)
个字节而不是512*sizeof(int)
个字节。它仍然不会花费额外的时间。操作系统可能不得不为线程的堆栈获取额外的内存页,但这或多或少是一次性成本。