月度归档:2018年10月

C++ OOP编程综述

Last Updated on 2023年7月11日

嵌套类和局部类

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

struct(class)的内存布局

  • C++的struct和class实例大小不会为0,即便它内部没有任何数据变量.主要是因为编译器总是需要为实例分配内存,使得对象能获得有效的地址,且不同对象的地址总应该是不同的.
  • 类型布局相关的名词有很多,如POD,Aggragate,naive等,具体我也不是很清楚,总之很麻烦.
    • 如果需要把sturct或class对象通过C风格直接从内存层面管理(如memcpy),那么要求它的内存布局是平凡的.
  • C++11之后,编译器只保证:
    • 同一个权限声明符block内的对象是顺序存储的(可能因对齐而不连续)
    • 同一个权限声明符level的不同block相对顺序是确定的
    • 编译器允许在满足上面约束的前提下任意重排类的数据成员布局.
  • 只要类型涉及到virtual, 那类型实例的首地址存储的一定是vptr, 涉及virtual只需满足任意一个条件:
    • 直接或间接使用虚继承
    • 直接或间接继承使用虚函数的基类
Read More