本节的讨论针对两种情况的效率进行分析:

class X
{public://数据成员memstatic double mem;
};X orgin;
X * pt = &orgin;//考虑以下两种情况各自的存取效率orgin.mem = 0.0;  //case1
pt->mem = 0.0;    //case2

Q1:mem是静态数据成员

• 每个静态数据成员都将被提出类之外,且只有一个实例,每次使用静态成员时,就被内部转换为对该唯一实例的直接操作

• 通过类对象访问静态成员只是一种文法上的妥协,(如x.static_member),此时静态成员并不在类中,存取静态成员并不需要通过类对象

• 对继承与虚基类等情况也是相同的处理,因为只有一个实例,同样能是直接存取其路径

• 对于通过函数调用静态数据成员的情况,cfront编译器的操作是直接抛弃该函数调用,而C++标准则明确要求函数必须被求值,虽然结果可能无用,如:

Eg:

        func().mem;  //X func()*Ubuntu对函数进行求值

• 若取一个静态成员的地址会得到一个指向其数据类型的指针,而不是一个指向类成员的指针,因为静态类成员并不在类对象中,如:

Eg:

class X{static const int static_member = 10;};&X::static_member;//得到类型如下的内存地址为:double*;而不是:double X::*;

结论:对静态成员的存取操作 case1 与 case2 效率相同

Q2:mem是非静态成员

• 对一个非静态数据成员进行存取操作,编译器需要把类对象的起始地址加上数据成员的偏移位置

• 对非静态成员的存取操作的执行效率在该成员是一个struct 成员、类成员、单一继承或多重继承的情况下,case 1 与 case 2都完全相同

• 但若该成员是虚基类的成员时,将会有重大的差异

• 若该类是一个虚基类的派生类,且存取的成员是虚基类的成员,此时分析如下:

1) 对 case 1,此时类对象的类型确定是 X,即使类 X 继承自虚基类,成员的偏移位置在编译时就确定了,因此可以直接进行存取2) 对 case 2,此时 pt s所指向的类类型无法确定,因此就不知道成员的偏移位置,所以此时存取操作将延迟执行期,经由一个额外的简介引导,才能进行存取操作

3.3 数据成员的存取相关推荐

  1. c/c++对象模型大总结:第5-8章、数据成员的存取与布局

    深度探索c++对象模型大总结.中 --第五~八章 作者:July.吴黎明. 声明:版权所有,侵权必究. 二零一一年三月十八日. 本文接上一篇 c++对象模型大总结:第1-4章.对象初探与构造函数,而写 ...

  2. C++【对象模型】 | 【05】类与类之间各种关系下对数据成员的存取、绑定、布局

    文章目录 索引 1.类继承造成的负担 2.data member 3.data member的绑定 4.data member的布局 5.data member的存取 静态数据成员 非静态数据成员 6 ...

  3. 【C++面向对象】类的数据成员:绑定、布局和存取

    一.数据成员的绑定(The binding of a data member) 先看一段代码: //某个头文件,从某处含入 extern float x;class Point3d { public: ...

  4. python创建学生类姓名学号_定义一个学生类,包含学号、姓名、平时成绩和考核成绩四个数据成员和以下成员方法(用Python语言):...

    定义一个学生类,包含学号.姓名.平时成绩和考核成绩四个数据成员和以下成员方法(用Python语言):Python实验题目:类与文件实验要求:1.定义类2.定义并使用类对象3.打开和存取文件... 定义 ...

  5. C++ 类中数据成员分布详解

    概述 我们都知道类中包含着数据成员,但是数据成员在内存中是怎样分布的呢?继承之后数据又是怎样布局的呢?下面对这些问题进行整理解答.首先说明的是类的空间分布是编译器编译的结果,不同的编译器有可能会不一样 ...

  6. 静态成员函数访问非静态数据成员【C++】

    静态数据成员 定义格式: static 类型名 静态数据成员名 ; 详解:由于静态数据成员属于本类的所有对象共享,不属于特定类对象,因此在未产生类对象时作用域就可见,即:在未产生类的实例时,就可以对它 ...

  7. C++中访问类的私有数据成员的第三种方法

    我们知道,C++的类是有封装性的,那么对于私有数据成员我们如果想在类外访问,一般而言无外乎这么两种方法: 1.通过公有的成员函数 2.通过友元 这是两种通常的做法,还有一种是比较"反常&qu ...

  8. Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)

    我们的目标:尽可能编写出运行效率更高,更健壮,更容易维护的C#代码. 原则一:尽可能的使用属性(property),而不是数据成员(field). Always use properties inst ...

  9. 理解数据成员指针、函数成员指针

    转自:http://www.cnblogs.com/malecrab/p/5572119.html 1. 数据成员指针 对于普通指针变量来说,其值是它所指向的地址,0表示空指针. 而对于数据成员指针变 ...

最新文章

  1. 《Effective C#中文版:改善C#程序的50种方法》读书笔记
  2. 重拾-Spring Transaction
  3. shell统计ip访问情况并分析访问日志
  4. BUG管理系统(Mantis)迁移实录
  5. 云炬Android开发笔记 7登陆注册功能开发
  6. 【Python】又一个Jupyter神器,操作Excel自动生成Python代码!
  7. Excel 2010 下拉菜单的制作方法
  8. html基础-html简介-第一个网页(1)
  9. 常用的友元重载运算符OSTREAM
  10. cuda gpu相关汇总
  11. 转:VMware、微软等四种主要的网络IO虚拟化模型
  12. vue input 赋值无效
  13. 集成Ehcache用来缓存表以后,怎么设置缓存刷新时间
  14. EAI企业应用集成场景及解决方案
  15. 'scipy._lib.messagestream' 以及 'scipy.interpolate.interpnd.array' 解决办法
  16. C++之生成器(builder)模式
  17. 2022软考中级软件设计师---易混淆知识点总结1
  18. 【编程常识】关于 Visual Basic 6.0 语言
  19. LeetCode刷题之1818. 绝对差值和
  20. Gateway网关- 微服务(十四)

热门文章

  1. Golang 容易找工作吗?
  2. 4项目管理--项目整合管理
  3. r调取mysql中数据_怎样使用r语言读取的sql数据
  4. 6个不为人知的资源网站,绝对大饱眼福
  5. 微信小程序 bindtap事件与catchtap事件
  6. SSE,MSE均方误差计算公式(训练误差,测试误差)
  7. 51M APP Tech Support
  8. J2SE 6 在国际化方面的增强
  9. 计算机桌面是哪个文件夹,win7旗舰版 桌面背景在哪个文件夹
  10. 电商项目可扩展性数据库设计与实现