C/C++后端开发八股文

一. C / C++ 编程

1. Main函数之前执行

(作为main,完成存储内容的构造)

设置栈指针

初始化静态变量(static)和全局变量(global)

赋值全局变量

(可能在完成以上过程中执行的内容)

调用构造函数

(main作为函数)

将main函数的参数 argc , argv 等传递给 main 函数 

【C的存储构造如下图C/C++后端开发八股文_第1张图片

2. Main函数之后执行

(作为main结束)

atexit注册的函数(传递信息,处理等)-> 倒序执行

全局对象的析构函数

3. 结构体对齐

Alignas \ alignof

pragma pack(push,1)

4. 引用和指针区别

(引用某变量 = 对指向某变量地址的指针取值)

指针是⼀个变量,存储的是⼀个地址,引⽤跟原来的变量实质上是同⼀个东⻄,是原变量的别名
指针可以有多级,引⽤只有⼀级(多级引用也是取相同地址的值没有意义)
指针可以为空,引⽤不能为NULL且在定义时必须初始化(空指针不能取值)
指针在初始化后可以改变指向,⽽引⽤在初始化之后不可再改变
sizeof指针得到的是本指针的⼤⼩,sizeof引⽤得到的是引⽤所指向变量的⼤⼩
当把指针作为参数进⾏传递时,也是将实参的⼀个拷⻉传递给形参,两者指向的地址相同,但不是同⼀个变量,在函数中改变这个变量的指向不影响实参,⽽引⽤却可以。(因为引用直接改变了地址上的值)
引⽤本质是⼀个指针,同样会占4字节内存
引⽤⼀旦初始化之后就不可以再改变;指针变量可以指向新的变量。

5. 传递函数参数时使⽤引⽤和指针的场景

需要返回函数内局部变量的内存的时候⽤指针。使⽤指针传参需要开辟内存,⽤完要记得释放指针,不然会内存泄漏。⽽返回局部变量的引⽤是没有意义的
对栈空间⼤⼩⽐较敏感(⽐如递归)的时候使⽤引⽤。使⽤引⽤传递不需要创建临时变量,开销要更⼩
类对象作为参数传递的时候使⽤引⽤(不可能创建新类,日常使用也没有对类对象取值,因此是通过引用的方式)

6. 堆和栈的区别

(管理⽅式)
堆中资源由程序员控制(容易产⽣memory leak),栈资源由编译器⾃动管理,⽆需⼿⼯控制
(内存管理机制)
系统有⼀个记录空闲内存地址的链表,当系统收到程序申请时,遍历该链表,寻找第⼀个空间⼤于申请空间的堆结点,删除空闲结点链表中的该结点,并将该结点空间分配给程序。只要栈的剩余空间⼤于所申请空间,系统为程序提供内存,否则报异常提示栈溢出。
(空间⼤小)
堆是不连续的内存区域,堆⼤⼩受限于计算机系统中有效的虚拟内存,所以堆的空间⽐栈灵活,⽐栈⼤。栈是⼀块连续的内存区域,⼤小是操作系统预定好的,windows下栈⼤⼩是2M。
(碎片问题)
对于堆,频繁地new/delete会造成大量碎片,使程序效率降低。对于栈,它是有点类似于数据结构上的⼀个先进后出的栈,进出⼀⼀对应,不会产生碎片。
(生长方向)
堆向上,向⾼地址⽅向增⻓。栈向下,向低地址⽅向增⻓。
(分配方式)
堆都是动态分配。栈有静态分配和动态分配,静态分配由编译器完成(如局部变量分配),动态分配由alloca函数分配,但栈的动态分配的资源由编译器进⾏释放,⽆需程序员实现。
(分配效率)
堆由C/C++函数库提供,机制很复杂。所以堆的效率⽐栈低很多。栈是其系统提供的数据结构,计算机在底层对栈提供⽀持,分配专⻔寄存器存放栈地址,栈操作有专⻔指令。

7. 堆快⼀点还是栈快⼀点

栈快⼀点。
因为操作系统会在底层对栈提供⽀持,会分配专⻔的寄存器存放栈的地址,栈的⼊栈出栈操作也⼗分简单,并且有专⻔的指令执⾏,所以栈的效率⽐堆⾼也⽐堆快。
⽽堆的操作是由C/C++函数库提供的,在分配堆内存的时候需要⼀定的算法寻找合适⼤⼩的内存。并且获取堆的内容需要两次访问,第⼀次访问指针,第⼆次根据指针保存的地址访问内存,因此堆⽐栈慢。

8. 区别指针类型

xx(f1) xx(f2) xx(f3) -> fa fb的fc (默认从左到右,有括号放最后)

int *p[10]表示指针数组,每个元素都是指向int类型。
int (*p)[10]表示数组指针,指向的是⼀个int类型的数组
int *p(int)是函数声明,函数名是p,参数是int类型的,返回值是int *类型的。
int (*p)(int)是函数指针,该指针指向的函数具有int类型参数,并且返回值是int类型的。

9. new / delete 与 malloc / free的异同

(相同点)

都可⽤于内存的动态申请和释放

(不同点)

new是类型安全的,malloc不是(即new会进行类型检查,确保分配的内存类型与对象的类型相匹配。而malloc本来就是显式转换指针)

new / delete 是C++运算符, 不需要库⽂件⽀持,不能重载; malloc / free是C/C++语⾔标准库函数,需要库⽂件⽀持,⽀持覆盖。

new⾃动计算要分配的空间大小,mall

你可能感兴趣的:(c语言,c++,开发语言)