我在接受采访时被问到,要告诉以下c / c ++代码陈述的确切区别
int a = 10;
和
int a;
a = 10;
虽然两者都分配了相同的值,但他们告诉我,两者在内存中存在很大差异。
有人可以向我解释一下吗?
答案 0 :(得分:4)
就语言而言,它们是两种方式来执行相同事物,初始化变量a
和分配 10到它。
声明
int a;
保留内存以获取肯定包含垃圾的值。
因此您使用a = 10;
在声明int a = 10;
中,这两个步骤在相同语句中完成。
首先,内存的一部分保留到变量a
,然后内存覆盖,值为10
。< / p>
int a = 10;
^^^^^ ^^^^^
reserve memory for the variable a write 10 to that memory location
关于内存,第一个声明在PC上使用的内存较少,因为使用的字符较少,因此.c
文件会更小。
但编译后生成的可执行文件将是相同。
重要:如果这些陈述超出任何功能,它们可能不相同(尽管它们会产生相同的结果)。
问题是第一个语句会在第一个语句中将0
分配给a
,因为大多数编译器会在C语言中对全局变量执行此操作(并且由C定义)标准)。
答案 1 :(得分:3)
&#34;虽然两者都分配了相同的值,但两者在内存中存在很大差异。&#34;
不,堆栈内存使用没有区别!
不同之处在于,通过初始化分配值可能会导致额外的汇编程序指令(以及存储它所需的内存,也就是代码占用)的额外成本,编译器无法优化这一点(因为它需要)。
如果您立即初始化a
,则代码中会有一些费用。当实际需要a
的值时,您可能希望延迟初始化以供以后使用:
void foo(int x) {
int a; // int a = 30; may generate unwanted extra assembler instructions!
switch(x) {
case 0:
a = 10;
break;
case 1:
a = 20;
break;
default:
return;
}
// Do something with a correctly initialized a
}
这可能是我公司特别是我的同事向您提出的面试问题。并且他们希望你回答,只是在第一名的int a;
声明是更有效的选择。
我说如果你真的对c和c ++语言有深入的了解,那么这个面试问题就是为了看看(尽管这是一种意味深长的人!)。
就个人而言,我通常会对这些事情进行采访时更方便。
我认为效果非常小。虽然它对嵌入式MCU目标非常重要,但是你的代码占用空间非常有限(比如说小于/等于256K),和/或需要使用实际上无法优化这个的编译器工具链自己出去。
答案 2 :(得分:0)
如果你在谈论一个全局变量(一个不会出现在代码块中但在所有函数/方法之外的变量):
int a;
生成零初始化变量。一些(大多数?)c ++实现会将这个变量放在一个专用于零初始化变量的内存位置(段?段?无论它叫什么)。
int a = 10;
将变量初始化为0以外的某些变量。某些实现在内存中有不同的区域。因此,此变量的地址(&a
)可能与之前的情况非常不同。
我想,这就是你的意思&#34;两者在记忆中的差异很大&#34;。
实际上,如果程序存在严重错误(内存溢出),这可能会影响您的程序 - 如果以某种方式定义a
,它们可能会被屏蔽。
P.S。为了说清楚,我在这里只讨论全局变量。因此,如果您的代码类似于int main() {int a; a = 10;}
- 此处a
通常在堆栈上分配,并且内存中没有&#34;差异&#34;在初始化和分配之间。