C++知识点小结(持续补充)

news/2025/2/1 18:05:38/

1、进程虚拟地址划分:

  • 内存分区和编译链接
  • C++内存分区(考虑const常量分区)
  • 32位操作系统上,3G用户空间+1G内核空间,从低地址到高地址:
    • .text段->.rodata段->.data段->.bss段->.heap段->.stack段->内核空间
    • .text段:存放指令,只读不写
    • .rodata段:存放字符串常量,只读不写
    • .data段:初始化的全局变量和静态变量,初始化值不为0
    • .bss段:未初始化数据的全局变量静态变量,或者是初始化为0的全局变量和静态变量
    • .heap段:new来的数据
    • .stack段:函数的局部变量等
  • 不同进程用户空间独立,内核空间共享
  • .stack段高地址向低地址增长,.heap段低地址向高地址增长,这两个分区段之间加载动态连接库(.so/.dll)

2、函数调用队栈的过程

3、编译连接

  • 可执行文件产生的四步:预编译、编译、汇编、连接
    • 预编译:
    • 编译:
    • 汇编:
    • 连接:
  • 可执行文件:windows(PE头的文件)、Linux(ELF文件)

4、形参带默认参数

5、内联函数

6、函数重载

7、const

8、const和指针

9、指针和引用

10、new和malloc

11、类和对象、this指针

12、析构函数和构造函数

13、深浅拷贝问题

14、继承的本质和原理

C++11汇总:

  • nullptr:nullptr和NULL的区别

    • C++中NULL宏定义出来的是0,为了区分0和空指针就有了nullptr
    • C中NULL宏定义出来的是(void*)0
  • bind绑定器(bind、function、lambda):

    • 弥补了bind1st 和 bind2nd的局限(只能作用于二元函数对象),可以将对多元函数对象进行绑定参数,并且还可以作用于普通函数、函数指针、lambda表达式等可以用来调用的实体,用来绑定参数并返回一个新的函数对象,底层的函数类型会随着参数的绑定进行改变;也可以使用占位符(命名空间placeholders),不进行参数绑定,最多可以有20个,在实际用到的时候传入参数;
  • function函数对象

    • 是个模板类,可以接收bind返回的函数对象、lambda匿名函数对象、普通函数等一些可以调用的目标实体,相当于是进行函数类型保存并封装,可以类似于函数指针的使用,但是底层调用的也是operator()重载;lambda表达式和bind返回的函数对象都只能作用于当前语句,function就解决了他们的问题,可以保存它们的类型并多次使用;一般是function和配合bind完成回调函数的设置;
  • lambda匿名函数对象

    • 语法是[中括号捕获外部变量](小括号参数列表)->右箭头返回值类型{花括号函数体},底层是编译器实现的匿名函数对象,通过小括号运行符重载实现的,参数列表不带mutale关键字的话,底层的operator重载默认是只读属性(const修饰的函数);比函数对象轻量,不用定义类;对外部变量的捕获可以是引用、也可以是值传递;
  • 智能指针:不带引用计数的智能指针、带引用计数的智能指针

    • 裸指针的使用,容易忘记delete,所以利用栈对象出作用域的特性管理裸指针,防止内存泄露,智能指针底层提供了->运算符重载和*运算符重载,能像正常指针来使用
    • auto_ptr:
      • 独占式的管理内存资源,永远只有最后一个auto_ptr管理资源
      • 底层只有裸指针和普通的拷贝构造和赋值重载,资源的转移,在代码复杂的时候不容易看出来,容易引起编码上的安全问题,使用已经转移资源的空指针;
    • unique_ptr:
      • 也是独占式的管理内存资源,相比于auto_ptr,删除了普通的拷贝构造和赋值重载,提供右值版本的,可以将资源转移摆在明面上,就是正常的左值必须通过std::move()才能进行资源转移,直接传左值编译会报错
    • shared_ptr
      • 共享式的管理的内存资源,底层有个内存资源计数器,每次拷贝或者赋值的时候,资源加1,每次有shared_ptr被释放的时候,资源减1,当资源数为0 的时候,释放资源;
      • 使用shared_ptr时候需要注意不能用裸指针重复赋值,会导致内存资源重复释放,因为资源计数器都不一样了,应该优先使用make_share比较安全
      • 使用get方法获取底层裸指针,要注意资源的安全
    • weak_ptr
      • 和share_ptr搭配使用,不改变引用计数,用来观测shared_ptr管理的资源生命周期,没有提供->运算符重载和*运算符重载,如果想使用资源可以通过lock()方法来将自己提升为shared_ptr,提升成功的前提是,shared_ptr管理的资源还存在(use_count>0);
    • 循环引用问题:不同的类里面定义了指向对方shared_ptr, 彼此相互引用,引用计数增加,导致堆上对象和类里面的智能指针共存,最后都不能被释放导致资源泄露,可以通过weak_ptr来解决,weak_ptr作为资源观测不会改变引用计数;
    • 自定义删除器问题:用智能指针管理不能正常delete的类型,比如文件句柄socket等,需要自己定义删除器
  • 移动语义std::move 和完美转发std::forwad

    • std::move
    • std::forwad

http://www.ppmy.cn/news/1008774.html

相关文章

Linux SSH 远程连接主机,并执行命令

应用场景 当需要远程到另一台Linux上,并在另一台机器上执行 Shell 命令,则需要注意命令的书写格式 示例说明 远程到 192.158.157.47 机器上,并执行命令 cd /tmp && ./zabbixagent_install.sh && echo Success 1、错误方式…

ELK常用语法和线上问题排查

ELK常用语法及线上问题排查 速查问题 1.全文搜索 在搜索栏输入目标值,查询所有字段中包含该值的文档 案例:用户反馈了一串id或者其他同事给了一个jobid,还没有头绪怎么查的时候,直接全局搜索 jobid 2.字段 限定字段全文搜索…

一起学SF框架系列5.13-spring-beans-类型转换TypeConverter

类型转换基本意思就是把一个数据从一个数据类型转换为另一种数据类型的值。 Spring的类型转换 Spring中,类型转换是将外部化(来自输入或其它来源)的bean属性值按属性对应的数据类型进行转换。类型转换在Spring容器中广泛被使用。也可以在应用…

unraid docker桥接模式打不开页面,主机模式正常

unraid 80x86版filebrowser,一次掉电后,重启出现权限问题,而且filebrowser的核显驱动不支持amd的VA-API 因为用不上核显驱动,解压缩功能也用不上,官方版本的filebrowser还小巧一些,18m左右 安装的时候总是…

深入解析人脸识别技术:原理、应用与未来发展

人脸识别技术:从原理到应用 引言人脸识别技术的重要性和应用领域 人脸识别的基本原理图像采集与预处理特征提取与表征数据匹配与比对 传统人脸识别方法主成分分析(PCA)线性判别分析(LDA)小波变换在人脸识别中的应用 深…

k8s概念-亲和力与反亲和力

回到目录 亲和力 Affinity 对部署调度时的优先选择 分为 节点亲和力 pod亲和力 pod反亲和力 节点亲和力 NodeAffinity 进行 pod 调度时,优先调度到符合条件的亲和力节点上 可配置 硬亲和力和软亲和力 RequiredDuringSchedulingIgnoredDuringExecution 硬…

数据结构——双链表

我宁愿靠自己的力量,打开我的前途,而不愿求有力者垂青 文章目录 双线向链表各接口函数名或变量名 双向链表接口实现源码 快速索引【头文件及函数声明】 双向链表接口实现 双向链表的构造分析 双向链表的定义及初始化 双向链表的插入和删除 往期…

LeetCode724. 寻找数组的中心下标

题干 给你一个整数数组 nums ,请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。…