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段会自动清零;
- 全局初始化数据区/静态数据区:.data,
- 栈区stack:由编译器自动分配释放,存放函数的参数值、局部参数的值等。每当一个函数被调用,该函数返回地址和调用信息,如某些寄存器内容,会被存储到栈区,这个被调用的函数再为它的自动变量和临时变量在栈区上分配空间,即C实现函数递归调用的方法
- 堆区heap:用于
动态内存分配
,malloc()申请的内存或者C++中通过new和delete动态分配。
六、数组名和指针区别
-
数组名对应的是指向数组首元素地址的指针,但该指针所指的地址不能被改写;
-
指针是变量指针,所指向的地址可以更改;
-
对数组名取地址,得到的是数组首元素的地址;对指针取地址,得到的是指针变量所在地址
-
对数组名使用sizeof,得到的是数组
元素个数
与元素类型字节数
的乘积;而对指针使用sizeof得到的是指针类型的字节数
七、strcpy和memcpy的区别
- 复制的内容不同:
strcpy
只能复制字符串,而memcpy
可以复制任意内容,例如字符数组、整型、结构体、类等 - 复制的方法不同:strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度
- 用途不同:通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
八、递归和循环如何选择
- 递归算法优点是代码简洁清晰,容易验证正确性;缺点是需要多次数的函数调用,如果调用层数比较深,需要额外增加堆栈处理,会对执行效率有一定影响
- 循环算法速度快,结构简单;缺点是不能解决所有问题,有些问题不太适用
总结:在求解规模不确定或求解规模明显过大情况下,递归的函数调用开销会很大,因此效率会很低
九、野指针
- 野指针是指指向内存未知区域或访问受限区域的指针,结果未知
产生原因
- 指针定义时未被初始化,默认值随机
- 指向的内存区域被释放时,指针没有置空
- 指针操作超越变量作用域,如函数返回指向栈内存的指针或引用
十、全局变量和静态变量区别
- 存储方式上并无区别,
都是静态存储方式
- 非静态全局变量作用域为整个源程序;当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的,而静态全局变量则限制了其作用域,只在定义该变量的源文件内有效