C++八股文-02

C++八股文-02

`


前言

本系列主要的目的是找工作,要记!里面的内容大部分来源于网络,以及自己的一些理解和总结!如果有错误的地方,希望各位大佬指正!
(听说点赞收藏+关注的人都会进大厂噢!加油!!)


一 、变量的作用域(全局变量和局部变量)

  • 全局变量:在所有函数体外部定义的,程序所在部分都可以使用,不受作用域的影响(生命期一直到程序的结束)
  • 局部变量:局限于作用域内,默认为auto关键字修饰,即进入作用域时自动生成,离开作用域时自动消失
  • 局部变量可以和全局变量重名,在局部变量作用域范围内,全局变量失效,采用的是局部变量的值

二、sizeof和strlen

  • sizeof是一个操作符或关键字,不是一个函数,而strlen是一个函数
  • sizeof返回一个对象或类型所占的内存字节数,不会对其中的数据或指针做运算
  • strlen返回一个字符串的长度不包括’/0’

三、sizeof(struct)和内存对齐

内存对齐作用:
1、移植原因:某些硬件平台只能在某些特定地址处取特定类型的数据;
2、性能原因:数据结构(尤其是栈)应尽可能在自然边界上对齐,未对齐内存需要做两次内存访问,对齐内存仅需要一次

struct内存对齐原则:

  • 结构体成员中,第一个成员偏移量是0,排列在后面的成员的当前偏移量必须是当前成员类型的整数倍
  • 结构体本身占用内存大小,应是结构体内最大数据成员的最小整数倍
  • #pragma pack(n)预编译指令,所有成员对齐以n字节为准,不再考虑当前类型和最大结构体内类型

union内存对齐原则:

  • union字节数必须是占用字节数最多的成员的字节数的倍数,而且需要能够容纳其他成员

四、inline函数

被频繁调用的函数会导致栈空间或栈内存的大量消耗,因此引入inline修饰函数,即内联函数;内联函数将在程序的每个调用点上“内联式地”展开。内联以代码膨胀为代价,省去了函数调用的开销,从而提高函数的执行效率

五、内存四区,变量存储区域(堆/栈)

  • 代码区:.text,存放只读存储区文本区,其中只读存储区存储字符串常量(常量区),文本区存储程序的机器代码
  • 数据区
    • 全局初始化数据区/静态数据区:.data,存储已初始化的全局变量和静态变量,整个生命周期内都可能需要访问
    • 未初始化数据区:.bss,存储未初始化的全局变量和静态变量,且在程序执行前BBS段会自动清零;
  • 栈区stack:由编译器自动分配释放,存放函数的参数值、局部参数的值等。每当一个函数被调用,该函数返回地址和调用信息,如某些寄存器内容,会被存储到栈区,这个被调用的函数再为它的自动变量和临时变量在栈区上分配空间,即C实现函数递归调用的方法
  • 堆区heap:用于动态内存分配,malloc()申请的内存或者C++中通过new和delete动态分配。
    在这里插入图片描述

六、数组名和指针区别

  • 数组名对应的是指向数组首元素地址的指针,但该指针所指的地址不能被改写;

  • 指针是变量指针,所指向的地址可以更改;

  • 对数组名取地址,得到的是数组首元素的地址;对指针取地址,得到的是指针变量所在地址

  • 对数组名使用sizeof,得到的是数组元素个数元素类型字节数乘积;而对指针使用sizeof得到的是指针类型的字节数

七、strcpy和memcpy的区别

  • 复制的内容不同:strcpy只能复制字符串,而 memcpy 可以复制任意内容,例如字符数组、整型、结构体、类等
  • 复制的方法不同:strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度
  • 用途不同:通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

八、递归和循环如何选择

  • 递归算法优点是代码简洁清晰,容易验证正确性;缺点是需要多次数的函数调用,如果调用层数比较深,需要额外增加堆栈处理,会对执行效率有一定影响
  • 循环算法速度快,结构简单;缺点是不能解决所有问题,有些问题不太适用
    总结:在求解规模不确定或求解规模明显过大情况下,递归的函数调用开销会很大,因此效率会很低

九、野指针

  • 野指针是指指向内存未知区域或访问受限区域的指针,结果未知

产生原因

  • 指针定义时未被初始化,默认值随机
  • 指向的内存区域被释放时,指针没有置空
  • 指针操作超越变量作用域,如函数返回指向栈内存的指针或引用

十、全局变量和静态变量区别

  • 存储方式上并无区别,都是静态存储方式
  • 非静态全局变量作用域为整个源程序;当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的,而静态全局变量则限制了其作用域,只在定义该变量的源文件内有效

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小杜在学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值