月度归档:2018年10月

C++模板编程简述

Last Updated on 2020年7月22日

模板作为一个C++中的一个高级特性,广泛应用于各种场合,以尽可能弥补自身作为编译语言的动态能力.然而,除非必要,模板应当尽可能的简单,避免本末倒置.

模板使用基础

  • 模板特性是编译器和链接器相互配合实现的.这可以辅助我们理解它的特性.
  • 编译期实例化时
    • 模板类型参数通常得是完全类型.
    • 模板非类型参数必须是constexpr
  • 在模板编程中,编译器对T::foo型语法分析可能会有歧义,例如,T::vl * p这样的语句可能是使用T的静态成员做乘法,也可能是创建一个T::vl
Read More

C++ OOP编程综述

Last Updated on 2020年4月15日

嵌套类和局部类

  • 定义在类X内的类Y称为嵌套类,它就是一个普通类,只不过使用的作用域被限制了.
  • 定义在函数内的类Y称为局部类,这种类限制很多,主要用于在语言层面支持Lambda,实践中基本不用.

struct和class的内存布局

  • C++的struct和class实例大小不会为0,即便它内部没有任何成员函数或成员变量.主要是因为编译器总是需要为实例分配内存,不占内存的实例是不存在的
  • 数据成员全为全public,无构造函数,无类内初始值,不使用继承及virtual的类,称为聚合类.聚合类可以通过{}进行逐成员初始化
  • 如果需要把sturct或class对象通过C风格直接从内存层面管理(如memcpy),那么就必须要求它的内存布局是平凡的(标准的),这写类型称为POD. 标准库中,is_pod::value可以判断其是否是可以直接操作的
  • 如果类内存在多个publicprivate声明,则编译器可能重排该类的内存布局(移动部分对象),这将导致成员排布和程序员的预期产生差异.
Read More