c++八股(一)

本文围绕C++开发展开,介绍了Main函数前后执行的代码,包括栈指针设置、全局变量初始化等;还讲解了结构体内存对齐规则,对比了指针和引用的区别、传参时指针和引用的使用场景、malloc和new的差异,探讨了free回收内存的机制,介绍了*在C++中的用法以及override和final关键字的作用。

 来自:阿秀的学习笔记

1、Main函数之前和之后执行的代码是什么

  • 设置栈指针
  • 初始化static和global全局变量(是被赋初值的).data段的内容
  • 初始化为0和没有初始化的字段会进入.bss区
  • 全局对象初始化,在main之前调用构造函数,这是可能会执行前的一些代码
  • 将main函数的参数argcargv等传递给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

不希望类被继承或虚函数被重写的时候可以加上

虚函数详解-优快云博客

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值