如果我输入int x
,它现在使用sizeof(int)
个字节的内存吗?是不是直到x有值?
如果x = b + 6
...在x之前在内存中给出了一个点,那该怎么办?
答案 0 :(得分:2)
答案 1 :(得分:1)
如果我输入int x,它现在使用sizeof(int)字节的内存吗?是不是直到x有值?
一旦声明了像int x;
之类的变量,就会占用内存空间(int
的情况下为4个字节)。赋予它x = 5
之类的值只会修改已经占用的内存。
如果x = b + 6 ...是x,在b之前在内存中给出一个点是什么?
要使此语句有效,必须在此语句之前声明x
和b
。至于哪一个首先在内存中分配,这取决于你在本声明之前做了什么。
示例:
int x = 5;
int b = 6;
x = b + 6; //your code
在这种情况下,x
之前已在内存中分配b
。
答案 2 :(得分:0)
实际上,当您进行函数调用时,已经分配了所有本地声明的变量所需的空间。
当您编译C函数并将其转换为汇编编译器时,添加过程prolog实际上重定位堆栈指针以打开函数参数的空间,返回值,局部变量和几个更多值来管理函数调用。
局部变量的分配顺序取决于编译器,并且不一定必须按声明或用法的顺序排列。
在分配任何值之前使用变量时。 CPU只使用已分配内存中的内容。它可能是0,它可能是一些垃圾值,或者它甚至可能是您之前的函数调用留在那里的值。完全取决于您的程序执行,操作系统和编译器。
所以这是最好的练习之一,总是尽快初始化你声明的内容。因为在分配值之前可能会错误地使用变量。并且如果它包含您要分配的正确值(假设为0,这是更可能的),那么它将工作一段时间。但是后来突然之间,你的程序可能会改变你没有预料到的行为,尽管它之前完美无缺。由于你的假设,调试可能会很痛苦。
答案 3 :(得分:0)
根据变量的定义位置,可以为其分配空格
extern int size;
之类的声明不会分配或占用任何内存,而是指一个只能由链接器解析的内存位置(如果实际定义在另一个转换单元中)在编译时保留给某些内存。
Peformance:
全局变量原则上会影响启动性能,因为全局内存初始化为零。这显然是一次性惩罚,除极端情况外可忽略不计。更大的可执行文件也需要更长的时间才能启动。
堆栈上的变量完全免受性能损失。它们未初始化(完全出于这些性能原因),并且用于递增堆栈指针的汇编程序代码不太关心增量。启动时最大堆栈大小固定为几KB或MB(当你试图将堆栈增加到超出限制时,程序通常会崩溃,你猜它会崩溃);因此,当堆栈增长时,与操作系统之间没有潜在的昂贵交互。
堆上的分配带来了相对较大的性能损失,因为它们总是涉及函数调用(malloc),然后实际上需要做一些工作,加上潜在的操作系统调用(将一个内存段放入程序中)地址空间),以及在长期运行的程序中将每个malloc与删除配对的必要性,这些程序必须不泄漏。 (当我说"比较大"我的意思是"与局部变量相比&#34 ;;在你的普通PC上你除了在最内圈之外你不需要考虑它。)