何时在C程序中分配和使用内存?

时间:2014-07-09 22:16:15

标签: c memory

如果我输入int x,它现在使用sizeof(int)个字节的内存吗?是不是直到x有值?

如果x = b + 6 ...在x之前在内存中给出了一个点,那该怎么办?

4 个答案:

答案 0 :(得分:2)

是的,只要您声明一个变量,如:

int x;

内存通常在堆栈上分配。话虽这么说,编译器非常聪明。如果它注意到您从未使用过该变量,则可以optimize it away

答案 1 :(得分:1)

  

如果我输入int x,它现在使用sizeof(int)字节的内存吗?是不是直到x有值?

一旦声明了像int x;之类的变量,就会占用内存空间(int的情况下为4个字节)。赋予它x = 5之类的值只会修改已经占用的内存。

  

如果x = b + 6 ...是x,在b之前在内存中给出一个点是什么?

要使此语句有效,必须在此语句之前声明xb。至于哪一个首先在内存中分配,这取决于你在本声明之前做了什么。

示例:

int x = 5; 
int b = 6;
x = b + 6; //your code

在这种情况下,x之前已在内存中分配b

答案 2 :(得分:0)

实际上,当您进行函数调用时,已经分配了所有本地声明的变量所需的空间。

当您编译C函数并将其转换为汇编编译器时,添加过程prolog实际上重定位堆栈指针以打开函数参数的空间,返回值,局部变量和几个更多值来管理函数调用。

局部变量的分配顺序取决于编译器,并且不一定必须按声明或用法的顺序排列。

在分配任何值之前使用变量时。 CPU只使用已分配内存中的内容。它可能是0,它可能是一些垃圾值,或者它甚至可能是您之前的函数调用留在那里的值。完全取决于您的程序执行,操作系统和编译器。

所以这是最好的练习之一,总是尽快初始化你声明的内容。因为在分配值之前可能会错误地使用变量。并且如果它包含您要分配的正确值(假设为0,这是更可能的),那么它将工作一段时间。但是后来突然之间,你的程序可能会改变你没有预料到的行为,尽管它之前完美无缺。由于你的假设,调试可能会很痛苦。

答案 3 :(得分:0)

根据变量的定义位置,可以为其分配空格

  • 编译时的全局变量和静态变量;
  • 在输入函数时运行时的局部变量(不是在遇到定义时 - @Faruxx指出了这一点);
  • 表示在执行malloc时在运行时通过malloc动态分配的对象(非变量)。对于程序的地址空间,Malloc通常会从系统(页面?4k?)请求更多内存,并在后续调用期间将其切换为字节大小的位(咳嗽)。

extern int size;之类的声明不会分配或占用任何内存,而是指一个只能由链接器解析的内存位置(如果实际定义在另一个转换单元中)在编译时保留给某些内存。

Peformance:

全局变量原则上会影响启动性能,因为全局内存初始化为零。这显然是一次性惩罚,除极端情况外可忽略不计。更大的可执行文件也需要更长的时间才能启动。

堆栈上的变量完全免受性能损失。它们未初始化(完全出于这些性能原因),并且用于递增堆栈指针的汇编程序代码不太关心增量。启动时最大堆栈大小固定为几KB或MB(当你试图将堆栈增加到超出限制时,程序通常会崩溃,你猜它会崩溃);因此,当堆栈增长时,与操作系统之间没有潜在的昂贵交互。

堆上的分配带来了相对较大的性能损失,因为它们总是涉及函数调用(malloc),然后实际上需要做一些工作,加上潜在的操作系统调用(将一个内存段放入程序中)地址空间),以及在长期运行的程序中将每个malloc与删除配对的必要性,这些程序必须不泄漏。 (当我说"比较大"我的意思是"与局部变量相比&#34 ;;在你的普通PC上你除了在最内圈之外你不需要考虑它。)