3.3 数据成员的存取
本节的讨论针对两种情况的效率进行分析:
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 数据成员的存取相关推荐
- c/c++对象模型大总结:第5-8章、数据成员的存取与布局
深度探索c++对象模型大总结.中 --第五~八章 作者:July.吴黎明. 声明:版权所有,侵权必究. 二零一一年三月十八日. 本文接上一篇 c++对象模型大总结:第1-4章.对象初探与构造函数,而写 ...
- C++【对象模型】 | 【05】类与类之间各种关系下对数据成员的存取、绑定、布局
文章目录 索引 1.类继承造成的负担 2.data member 3.data member的绑定 4.data member的布局 5.data member的存取 静态数据成员 非静态数据成员 6 ...
- 【C++面向对象】类的数据成员:绑定、布局和存取
一.数据成员的绑定(The binding of a data member) 先看一段代码: //某个头文件,从某处含入 extern float x;class Point3d { public: ...
- python创建学生类姓名学号_定义一个学生类,包含学号、姓名、平时成绩和考核成绩四个数据成员和以下成员方法(用Python语言):...
定义一个学生类,包含学号.姓名.平时成绩和考核成绩四个数据成员和以下成员方法(用Python语言):Python实验题目:类与文件实验要求:1.定义类2.定义并使用类对象3.打开和存取文件... 定义 ...
- C++ 类中数据成员分布详解
概述 我们都知道类中包含着数据成员,但是数据成员在内存中是怎样分布的呢?继承之后数据又是怎样布局的呢?下面对这些问题进行整理解答.首先说明的是类的空间分布是编译器编译的结果,不同的编译器有可能会不一样 ...
- 静态成员函数访问非静态数据成员【C++】
静态数据成员 定义格式: static 类型名 静态数据成员名 ; 详解:由于静态数据成员属于本类的所有对象共享,不属于特定类对象,因此在未产生类对象时作用域就可见,即:在未产生类的实例时,就可以对它 ...
- C++中访问类的私有数据成员的第三种方法
我们知道,C++的类是有封装性的,那么对于私有数据成员我们如果想在类外访问,一般而言无外乎这么两种方法: 1.通过公有的成员函数 2.通过友元 这是两种通常的做法,还有一种是比较"反常&qu ...
- Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)
我们的目标:尽可能编写出运行效率更高,更健壮,更容易维护的C#代码. 原则一:尽可能的使用属性(property),而不是数据成员(field). Always use properties inst ...
- 理解数据成员指针、函数成员指针
转自:http://www.cnblogs.com/malecrab/p/5572119.html 1. 数据成员指针 对于普通指针变量来说,其值是它所指向的地址,0表示空指针. 而对于数据成员指针变 ...
最新文章
- 《Effective C#中文版:改善C#程序的50种方法》读书笔记
- 重拾-Spring Transaction
- shell统计ip访问情况并分析访问日志
- BUG管理系统(Mantis)迁移实录
- 云炬Android开发笔记 7登陆注册功能开发
- 【Python】又一个Jupyter神器,操作Excel自动生成Python代码!
- Excel 2010 下拉菜单的制作方法
- html基础-html简介-第一个网页(1)
- 常用的友元重载运算符OSTREAM
- cuda gpu相关汇总
- 转:VMware、微软等四种主要的网络IO虚拟化模型
- vue input 赋值无效
- 集成Ehcache用来缓存表以后,怎么设置缓存刷新时间
- EAI企业应用集成场景及解决方案
- 'scipy._lib.messagestream' 以及 'scipy.interpolate.interpnd.array' 解决办法
- C++之生成器(builder)模式
- 2022软考中级软件设计师---易混淆知识点总结1
- 【编程常识】关于 Visual Basic 6.0 语言
- LeetCode刷题之1818. 绝对差值和
- Gateway网关- 微服务(十四)