• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2021-12-30 21:56 Aet 隐藏边栏 |   抢沙发  6 
文章评分 2 次,平均分 5.0

常用特殊

静态类型动态类型

  1. 主要区别在于对类型进行检查的时间点。
  2. 对于所谓的静态类型,类型检查主要发生在编译阶段。
  3. 对于动态类型,类型检查主要发生在运行阶段(和类型推导相关)。

auto

  1. auto声明变量的类型必须由编译器在编译时期推导而得。
  2. auto声明的变量必须被初始化,以使编译器能够从其初始化表达式中推导出其类型。
  3. 对于指针,auto和auto*没有区别。
  4. 对于volatile和const,声明为auto的变量并不能从初始化表达式中带走这两种限制符。

  1. 不能推导:
    1. 函数形参不能为auto
    2. 结构体非静态成员的类型不能是auto
    3. 不能声明auto数组
    4. 不能在实例化模板的时候用auto作为参数

typeid

  1. RTTI机制为每个类型产生一个type_info类型的数据,我们可以在程序中使用typeid查询一个变量的类型,typeid会返回变量相应的type_info数据。
  2. type_info的name成员返回类型的名字。
  3. C++11中,增加了hash_code成员函数,返回该类型唯一的哈希值,可以对变量的类型随时进行比较。

decltype

  1. 推导类型。
  2. 推导规则:
    1. 如果e是一个没有带括号的标记符表达式或者类成员访问表达式,那么decltype(e)就是e所命名的实体的类型。
      如果e是一个被重载的函数,则会导致编译时错误。
    2. 否则,假设e的类型是T,如果e是一个将亡值,那么decltype(e)为T&&。
    3. 否则,假设e的类型是T,如果e是一个左值,则decltype(e)为T&。
    4. 否则,假设e的类型是T,则decltype(e)为T。

追踪返回类型

范围for

类型安全

枚举

缺点:

  1. 允许隐式转换为整型。
  2. 占用存储空间及符号性不确定。

强类型枚举

  1. 强作用域
  2. 转换限制
  3. 可以指定底层类型

内存管理问题

  1. 野指针
    1. 一些内存单元已被释放,之前指向它的指针却还在被使用。
  2. 重复释放
    1. 程序试图去释放已经被释放过的内存单元。
  3. 内存泄露
    1. 不再需要使用的内存单元如果没有被释放就会导致内存泄露。

unique_ptr

  1. 不能与其他unique_ptr类型的指针对象共享所指对象的内存。
  2. 对内存的这种占用权,可以通过std::move来转移。
  3. 从实现上,unique_ptr是删除了拷贝构造函数,保留了移动构造函数的指针封装类型。

shared_ptr

  1. 多个该智能指针可以共享同一堆分配对象的内存。
  2. shared_ptr使用了引用计数。

weak_ptr

  1. 指向shared_ptr指针指向的对象内存,却并不拥有该内存。
  2. 使用lock,可以返回其指向shared_ptr指针指向的对象内存。所在所指对象内存无效时,返回nullptr。

性能

运行时常量

  1. const,具有运行时数据不可更替性。

编译时常量

  1. constexpr

常量表达式函数

  1. 函数体只有单一的return返回语句。
  2. 函数必须返回值。
  3. 在使用前已经有定义。
  4. return语句表达式中不能使用非常量表达式的函数、全局数据,且必须是一个常量表达式。

常量表达式值

  1. 两者在大多数情况下是没有区别的。
  2. 如果i是在全局命名空间中,编译器会为i产生数据。
    对于j,如果不是有代码显示的使用了它的地址,编译器可以选择不为它生成数据,而仅将其当成编译期的值。
  3. 对于浮点常量,编译期的浮点常量和实际运行时的浮点常量可能在精度上存在差别。
    在C++11中,编译时的浮点数常量表达式是被允许的。
  4. 对于模板,C++11标准规定,声明为常量表达式的模板函数,如果该模板函数的实例化结构不满足常量表达式的需求的话,constexpr会被自动忽略。

原子操作

  1. 多线程程序中“最小的且不可并行化的”操作。
  2. 通常对一个共享资源的操作是原子操作的话,意味着多个线程访问该资源时,有且仅有一个线程在对这个资源进行操作。
  3. 通常情况下,原子操作都是通过“互斥”的访问来保证的。

原子类型

  1. C++11原子类型

内存模型

  1. 内存模型通常是一个硬件上的概念,表示的是机器指令是以什么样的顺序被处理器执行的。
  2. 现代的处理器并不是逐条执行机器指令的。
  3. 强序:
    1. 指令是被按照顺序被处理器执行的
  4. 弱序:
    1. 对于某些运行顺序没有影响的指令,一些处理器就可能将其错序执行。
  5. 对于多线程而言,强序:
    1. 强序意味着,多个线程看到的执行顺序是一致的。
    2. 具体地,对于共享内存的处理器而言,需要看到内存中的数据被改变的顺序和机器指令中的一致。
  6. 对于多线程,弱序:
    1. 线程间看到的内存数据被改变的顺序于机器指令中声明的不一致。

memory_order

线程局部存储

  1. 所谓线程局部存储变量,就是拥有线程声明期及线程可见性的变量。
  2. 线程局部存储实际上是由单线程程序中的全局/静态变量被应用到多线程程序中被线程共享而来。

quick_exit

  1. 该函数并不执行析构函数,而只是使程序终止。
  2. abort通常是异常退出。
  3. quick_exit和exit属于正常退出。

at_quick_exit

  1. at_quick_exit注册的函数也可以在quick_exit的时候被调用。
  2. 这样一来,可以同样像exit一样做一些清理的工作。
  3. 在C++11标准中,at_quick_exit和at_exit一样,标准要求至少支持32个注册函数的调用。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享