来自:阿秀的学习笔记
1、Main函数之前和之后执行的代码是什么
-
设置栈指针
- 初始化static和global全局变量(是被赋初值的).data段的内容
- 初始化为0和没有初始化的字段会进入.bss区
- 全局对象初始化,在
main之前调用构造函数,这是可能会执行前的一些代码 - 将main函数的参数
argc,argv等传递给main函数,然后才真正运行main函数 __attribute__((constructor))
之后执行对全局对象的析构,atexit 出口函数/登记函数:可以用来指定退出的动作 比如数据库解锁 log文件写入等
2、结构体内存对齐
- 结构体内成员按照声明顺序存储,第一个成员地址和整个结构体地址相同。
- 未特殊说明时,按结构体中size最大的成员对齐(若有double成员,按8字节对齐。)
- 使用alignas关键字指定对齐大小 使用alignof查看目前对齐的大小
struct Info { uint8_t a; uint32_t b; uint8_t c; }; std::cout << sizeof(Info) << std::endl; // 12 4 + 4 + 4 std::cout << alignof(Info) << std::endl; // 4 struct alignas(2) Info2 { uint8_t a; uint32_t b; uint8_t c; }; std::cout << sizeof(Info2) << std::endl; // 12 4 + 4 + 4 std::cout << alignof(Info2) << std::endl; // 4
3、指针和引用的区别
-
指针是一个变量,存储了一个地址
-
引用是一个变量的别名
-
指针可以为空,引用不能为空
-
指针可以指向其他地方,引用不能
4、传参的时候什么时候使用指针,什么时候使用引用
- 返回函数内部开辟的空间时,需要返回指针,函数的引用不能返回,在使用后会被释放
- 传指针需要空间,对内存敏感时传引用
- 类对象作为参数传递时使用引用 C++类对象传递规范
5、malloc和new的区别
malloc是函数 返回的是无类型指针,且需要自己指定空间,且不调用构造函数
new返回的是有类型指针会自己计算空间大小,是一种可以重载的运算符
free直接释放空间 不会析构
delete会调用析构函数
6、free回收内存会立即返回给操作系统吗
不会,会用ptmalloc保存起来,下次申请的时候再看这里是否有合适的防止频繁系统调用
7、*在c++中的使用
int *p[10] 指针数组 里面有10个指向int类型的指针(指针大小和机器无关 和编译有关)
编译链接_编译链接四个步骤_csuzhucong的博客-优快云博客
int (*p)[10] 是一个数组的指针 代表这个指针指向一个大小为10的int数组
int *p(int) 是函数声明
int (*p)(int)是函数指针
8 、override和final关键字
override
用于检查是否是虚函数的实现
final
不希望类被继承或虚函数被重写的时候可以加上
本文围绕C++开发展开,介绍了Main函数前后执行的代码,包括栈指针设置、全局变量初始化等;还讲解了结构体内存对齐规则,对比了指针和引用的区别、传参时指针和引用的使用场景、malloc和new的差异,探讨了free回收内存的机制,介绍了*在C++中的用法以及override和final关键字的作用。
1076

被折叠的 条评论
为什么被折叠?



