一些基本的C ++概念 - 初始化和赋值

时间:2014-09-08 17:57:53

标签: c++

我在接受采访时被问到,要告诉以下c / c ++代码陈述的确切区别

int a = 10;

int a;
a = 10;

虽然两者都分配了相同的值,但他们告诉我,两者在内存中存在很大差异。

有人可以向我解释一下吗?

3 个答案:

答案 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;在初始化和分配之间。