7.19 结构体和类的效率

结构体和类

对于效率的积极影响:

  1. 对于结构体和类,其成员会被存储在一起,这样使得数据缓存更有效率。
  2. 在将结构体或类当做参数传递时,不需要将成员变量分开成一个个的参数,避免了参数传递的开销。

对于效率的不良影响:

  1. 非静态成员函数拥有一个this 指针(因为this 指针总是可用的),该指针作为隐形参数传递给函数。this 的参数传输开销会在所有非静态成员函数上产生。
  2. this 指针占用一个寄存器。在32位系统中,寄存器总是一个稀缺资源。

类的数据成员(变量实例)

  1. 类或结构体的数据成员是按创建类或结构实例时声明它们的顺序连续存储。将数据组织到类或结构体中不存在性能损失。同样,访问类或结构体对象的数据成员所花费的时间也不比简单变量多。
  2. 大多数编译器将数据成员对齐到可以被特定数整除的地址以优化访问。
  3. 但是对齐会使在顺序存储下出现字节空洞,为了解决这个问题,我们通常会对数据成员进行重新排序,使结构体或类变得更小。
  4. 如果成员相对于结构体或类的开头的偏移量小于 128,则访问数据成员的代码会更紧凑,因为偏移量可以表示为 8位有符号数字。如果相对于结构或类的开头的偏移量是 128字节或更多,那么偏移量必须表示为 32位数字。因此,建议在结构或类声明中,大数组和其他大对象放在最后,最常用的数据成员放在前面。如果不可能在前 128 个字节中包含所有数据成员,则将最常用的成员放在前 128个字节中。
  5. 第二条和第三条要综合考虑。

类的成员函数(方法)

  1. 每次声明或创建新的对象,它都会为数据成员生成新的实例。但是,每个成员函数只有一个实例。函数代码不会被复制,因为函数代码可以被重复使用。
  2. 调用类的成员函数,与使用指针或引用的单独函数,一样快。
    在这里插入图片描述
  3. 上图Sum1、Sum2、Sum3是一样快的。
  4. 一些编译器使用寄存器而不是栈来存储指针,这样Sum1就会快一些。
  5. 静态成员函数不能访问任何非静态数据成员或非静态成员函数。静态成员函数比非静态成员函数快,因为它不需要 this 指针。如果成员函数不需要访问任何非静态的东西,可以通过将它们声明为静态以变得更快。

虚成员函数

  1. 一个多态类的每个实例都有一个指针指向一个指针表(虚函数表),其中的指针指向虚函数的不同版本。
  2. 多态性是面向对象程序比非面向对象程序效率低的主要原因。

运行时类型识别(RRTI)

  1. 编译器可能有RTTI选项,效率不高,基本需要关闭使用。

继承

  1. 一般可以假设使用继承没有任何损失。
  2. 接第一条,需要注意偏移量问题和不同位置的函数互相使用的问题。
  3. 多继承会导致成员指针和虚函数,可以使用在类内创建对象来代替。

构造函数和析构函数

  1. 构造函数在内部被实现为一个成员函数,该成员函数返回对象的引用。新对象的内存分配不一定由构造函数本身完成。因此构造函数和其他成员函数效率一样。这适用于默认构造函数、复制构造函数和任何其他构造函数。
  2. 如果复制构造函数涉及内存或其他资源的分配,则它可以相当耗时。我们可以通过使用对象的引用或指针而不是复制它来替换;将内存块的所有权从一个对象转移到另一个对象。

union

  1. 在union中,只要为任一数据成员赋值,其它成员就会变成未定义状态,即共用存储空间。
  2. 唯一的好处就是节省空间了(以前程序员真的为省点空间啥都使得出。

位域

  1. 位域可能有助于使数据更加紧凑。访问位域成员不如访问结构的成员效率高。如果在大数组可以节省缓存空间或使文件更小,那么额外的时间是合理的。
  2. 使用 <<| 组合操作来操作位域比单独操作成员要快。

重载函数

  1. 重载函数的不同版本被简单地视为不同的函数。使用重载函数没有性能损失。

重载运算符

  1. 重载的运算符相当于一个函数。使用重载运算符与使用具有相同功能的函数效率一样。
  2. 表达式具有多个重载运算符,将导致为中间结果创建临时对象,大多数编译器会在简单的情况下自动进行优化。

模板

  1. 模板与宏的相似之处在于,模板参数在编译之前被它们的值所替换。
  2. 使用模板参数而不是函数参数的优点是避免了参数传递的开销。缺点是编译器需要为每个不同的值创建模板函数的新实例。
  3. 模板参数可以是类型,也可以具体的数字。
  4. 模板是高效的,因为模板参数总是在编译时被解析。
  5. 模板类可用于实现编译时多态性,这比使用虚拟成员函数获得的运行时多态性更加高效。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值