C++---面经总结二(本人校招面试中,持续更新......)

目录

1、main函数之前执行和之后执行的代码可能有哪些?

2、结构体对齐方式?

3、指针和引用的区别?

4、在函数传参时,什么时候传指针,什么时候传引用?

5、堆和栈哪个快?

6、宏定义、函数、typedef的区别?

7、strlen和sizeof的区别?

8、override 和 final 关键字?

9、野指针和空悬指针?

10、深拷贝和浅拷贝?

11、如何用代码判断大小端存储?

12、什么情况下会调用拷贝构造函数?

13、C++里面几种new?

14、值传递、指针传递、引用传递的区别和效率?

15、静态变量什么时候初始化?

16、const关键字的作用?

17、从汇编层解释引用?

18、C++中string与C语言中 char* 的区别?


1、main函数之前执行和之后执行的代码可能有哪些?

main函数之前:

  • 设置栈指针,开辟main函数栈帧,main函数有参数的话进行参数压栈;
  • 初始化静态变量和全局变量,也就是 .data 段内容;
  • 将未初始化的全局变量进行初始化为0(其中bool型为false),也就是 .bss 段内容;
  • 全局对象的初始化,在main函数之前调用构造函数;

main函数之后:

  • 全局对象的析构函数会在main函数之后执行;
  • 由atexit注册的函数,会在main函数执行之后执行;可以多次调用注册多个,但执行顺序与注册顺序相反;(atexit称为注册函数)

2、结构体对齐方式?

  • 结构体内成员按照声明的顺序存储,第一个成员地址和整个结构体地址相同;
  • 未特殊说明时,按结构体中size最大的成员对齐,(若有double成员,按8字节对齐);

注意:C++11以后引入两个关键字 alignas 和 alignof

  • alignas:可以指定结构体的对齐方式,但是若指定的小于自然对齐的最小单位,则忽略;
  • alignof:可以获取类型的对齐方式;
  • 若想使用单字节对齐,可以使用 #pragma pack(1);

3、指针和引用的区别?

        抛出重点:引用是类型更加安全的一种指针,定义一个指针和定义一个引用,二者在汇编代码上是完全一样的。安全是指:定义一个指针可以不用初始化,因此在程序中使用该指针的时候我们首先要判断一下指针是否合法;定义一个引用必须进行初始化,所以更加安全。

  •  指针是一个变量,存储的是一个地址,引用和原来的变量本质上是同一个东西,是原变量的别名;
  • 指针可以有多级指针,引用只有一级;
  • 指针在初始化之后可以改变指向,引用在初始化之后不可再改变;
  • 当把指针作为参数进行传递时,也是将实参的一个拷贝传递给形参,两者指向的地址相同,但不是同一个指针变量,在函数中改变这个变量的指向并不影响实参(也就是值传递),而引用却可以,在函数中对参数的改变就相当于是对实参的直接操作;
  • 引用本质是一个指针,所以对引用本身来说,在32位操作系统上大小也是4个字节;
  • 不存在指向空值的引用,但存在指向空值的指针;

4、在函数传参时,什么时候传指针,什么时候传引用?

  • 需要返回函数内局部变量的内存的时候用指针,使用指针传参需要开辟内存,用完之后记得释放指针,不然会造成内存泄漏;而返回局部变量的引用是没有意义的。
  • 对栈空间大小比较敏感(比如递归)的时候使用引用,因为引用传递不需要创建临时变量,开销更小。
  • 类对象作为参数传递的时候使用引用,这是C++类对象传递的标准方式。

5、堆和栈哪个快?

        抛出结论:栈更快

  • 操作系统在底层为栈提供支持,会分配专门的寄存器存放栈的地址,栈的出入栈操作也十分简单,并且有专门的指令执行,所以栈的效率高且快;
  • 堆的操作是由C/C++函数库提供的,在分配堆内存时需要一定的算法寻找合适大小的内存,并且获取堆的内容需要两次访问,第一次访问指针,第二次根据指针保存的地址访问内存,因此堆比较慢。

6、宏定义、函数、typedef的区别?

  • 宏定义在预处理阶段完成文本替换,不存在函数调用的过程;函数在运行阶段需要跳转到具体 的函数,存在函数调用开销;typedef属于编译的一部分,主要用于定义类型别名;
  • 宏定义参数没有类型,不进行类型检查;函数和typedef要进行类型检查;

7、strlen和sizeof的区别?

  • sizeof是运算符,编译时得到类型的大小;strlen是库函数,运行时得到大小;
  • sizeof参数可以是任何数据类型;strlen函数的参数只能是字符指针且末尾是 ‘\0’ 的字符串;
  • sizeof的值在编译时期确定,所以不能用来得到动态分配存储空间的大小。</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值