#include <iostream>
#include <vector>
using namespace std;/** c++对象内存模型 **////一、空类字节大小
class EmptyClass {
public:
};///二、对象类型占用字节大小
//结构体的有效对齐值的确定:
//1)当未明确指定时,以结构体中最长的成员的长度为其有效值
//2)当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值。数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。影响各成员偏移与总大小
class IntClass{
public:int data;//成员数据类型占了几个字节,类就占多少个字节
};class IntIntClass{
public:int data_1;//成员数据类型占了几个字节,类就占多少个字节int data_2;
};class IntCharClass{
public:int data_1;//会出现数据对齐:当未明确指定时,以结构体中最长的成员的长度为其有效值long data_2;
};class IntLongClass{
public:int data_1;//会出现数据对齐:当未明确指定时,以结构体中最长的成员的长度为其有效值long data_2;
};///三、有虚函数的类的内存模型
//对于有虚函数的类,编译器会为其分配一个叫虚函数表(virtual table)的东西,编译器会为这个类本身以及其所有子类插入一个叫虚函数表指针(vptr)的东西(一般放在类内存结构的最前面)。
//如何通过虚函数表和虚函数指针访问到正确版本的虚函数?编译器在编译器就为子类分配好了一个偏移n,假设虚函数表指针为vptr,某个子类的某个虚函数在虚函数表中的偏移为n,那么调用这个虚函数就相当于(*this->vptr[n])(this)
//每个类无论有多少个虚函数,都只有一个虚函数表和一个虚函数表指针;虚函数表跟类走,虚函数指针跟对象走
//32位机器上,vptr大小为4字节,64位机器上8字节
class ClassWithVirtualFunction {
public:virtual void DoNothingFunction() {};
};class ClassWith2VirtualFunction {
public:virtual void DoNothingFunction() {};virtual void DoNothingFunction2() {};
};int main() {///一、空类字节大小//空类所占字节是1//原因:网上听回来的解释是避免sum / sizeof(EmptyClass)出现分母为0的情况;也是C++要求每个实例在内存中都有独一无二的地址。EmptyClass empty_class;cout << "1.空类占用空间大小\n";cout << "1.1.Sizeof empty class is: " << sizeof(EmptyClass) << endl;cout << "1.2 Sizeof EmptyClass object is: " << sizeof(empty_class) << endl;cout << endl;///二、对象类型占用字节大小//对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。cout << "2.对象类型占用字节大小\n";cout << "2.1.Sizeof IntClass class is: " << sizeof(IntClass) << endl;cout << "2.2 Sizeof IntIntClass class is: " << sizeof(IntIntClass) << endl;cout << "2.3 Sizeof IntCharClass class is: " << sizeof(IntCharClass) << endl;//会出现数据对齐cout << "2.4 Sizeof IntLongClass class is: " << sizeof(IntLongClass) << endl;//会出现数据对齐cout << endl;///三、有虚函数的类的内存模型//对于有虚函数的类,编译器会为其分配一个叫虚函数表(virtual table)的东西,编译器会为这个类本身以及其所有子类插入一个叫虚函数表指针(vptr)的东西(一般放在类内存结构的最前面)。//如何通过虚函数表和虚函数指针访问到正确版本的虚函数?编译器在编译器就为子类分配好了一个偏移n,假设虚函数表指针为vptr,某个子类的某个虚函数在虚函数表中的偏移为n,那么调用这个虚函数就相当于(*this->vptr[n])(this) //每个类无论有多少个虚函数,都只有一个虚函数表和一个虚函数表指针;虚函数表跟类走,虚函数指针跟对象走ClassWithVirtualFunction class_with_virtual_function;ClassWith2VirtualFunction class_with_two_virtual_function;cout << "3.有虚函数的类的内存模型\n";cout << "3.1.Sizeof ClassWithVirtualFunction class is: " << sizeof(ClassWithVirtualFunction) << endl;cout << "3.2 Sizeof ClassWith2VirtualFunction class is: " << sizeof(ClassWith2VirtualFunction) << endl;cout << "3.3.Sizeof class_with_virtual_function object is: " << sizeof(class_with_virtual_function) << endl;cout << "3.4 Sizeof class_with_two_virtual_function object is: " << sizeof(class_with_two_virtual_function) << endl;cout << endl;}

类对象模型实验:类数据成员大小相关推荐

  1. 对于类对象模型的理解(类大小计算+大小端字节序)

    类对象模型 如何理解类与对象 类: 通俗理解,类相当于一个模型框架,限定了类有哪些成员变量,但从底层来看,内存并没有分配实际的物理空间来存储类 对象: 类对象即为类的具体描述,当类对象进行实例化过程中 ...

  2. 04 c++ 类数据成员的地址和类对象数据成员的地址

    2020年10月4日 1,类数据成员和类对象数据成员地址的区别 (1) 类定义是一种类型声明,存在于代码块中,并没有分配内存空间:对类的数据成员取地址,得到的是类的数据成员在类内的相对偏移量: (2) ...

  3. python类中定义数据-类数据成员与对象数据成员

    类数据成员 python的类数据成员是不需要用self修饰的.例如 class my_class(object):value_list=[1,2]class1=my_class()print(my_c ...

  4. C++ 类和对象(一):类的概念、类的访问控制和封装、类对象模型、this指针

    类的概念 类的访问控制和封装 类的对象模型 this指针 类的概念 在C++中,类可以说是最重要的东西,因为C++一开始的定位就是c with class,也正是因为引入了类,才让c++从c的面向过程 ...

  5. allocator类编程实验

    allocator类编程实验 基本知识 allocator uninitialized_copy.uninitialized_fill等函数 示例程序 示例代码 usealloc.cpp useall ...

  6. 类的6个默认成员函数:构造函数、析构函数、拷贝构造函数、重载运算符、三/五法则

    文章目录 6个默认成员函数 构造函数 概念 默认构造函数的类型 默认实参 概念 默认实参的使用 默认实参声明 全局变量作为默认实参 某些类不能依赖于编译器合成的默认构造函数 第一个原因 第二个原因 第 ...

  7. 访问属性与类数据成员

    为什么要使用属性:一个良好的类不仅仅要将类的实现部分隐藏起来,还会限制外部对类中成员变量(Field)的访问权限.在C#中,你可以通过属性和属性访问器(Accessor)来达到这个目的,因此属性也经常 ...

  8. 计算机课程实验教学案例,联席会|第四届全国计算机类课程实验教学案例设计竞赛|...

    一.竞赛目的 为实现高校计算机类课程实验教学体系与教学内容的协同,推进探究性.创新性实验教学改革,提升高校教师的实验教学水平.以问题为导向,在教学中培育大学生创新意识和工程实践能力,促进高等教育质量工 ...

  9. 【 C++ 】类和对象(中)—— 类的6个默认成员函数

    目录 1.类的6个默认成员函数 2.构造函数 构造函数概念 构造函数特性 3.析构函数 析构函数概念 析构函数特性 4.拷贝构造函数 拷贝构造函数概念 拷贝构造函数特性 5.赋值运算符重载 运算符重载 ...

  10. 【类脑实验】`Hopfield` 模型的实现

    类脑实验记录系列:实验1 Hopfield 模型的实现 实验名称:Hopfield 模型的实现 课程名称:认知科学与类脑计算 一 实验目的: 加深对 Hopfield 模型的理解,能够使用 Hopfi ...

最新文章

  1. love2d--glsl03噪声
  2. 微信小程序的多选改变样式_微信小程序button选中改样式-实现单选/多选
  3. Android --- Session ‘app’: Error Launching activity解决办法
  4. 24丨基础篇:Linux磁盘I-O是怎么工作的(上)
  5. 安卓多线程——AsyncTask
  6. PCA主成分分析+SVM实现人脸识别
  7. 浏览器兼容性问题解决方案之CSS——已在IE、FF、Chrome测试
  8. Azure夜校培训第二场2月22日18:00 正式盛情开幕
  9. goahead上传文件【原创】
  10. 百行征信大揭秘,字段中间找关系
  11. CodeVS 1031 质数环(DP)
  12. VIBE算法(一)——论文翻译
  13. linux kvm usb设备,KVM使用USB设备的方法
  14. ERROR: The process abc.exe with PID 6588 could not be terminated.
  15. python RGB与LCH互转 算法
  16. kafka自带的zk启动_kafka单机安装和启动
  17. 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始
  18. 95年有g510台式计算机吗,台式电脑太老了换cpu能行吗?
  19. MySQL练习(一)
  20. 写给自己的Java程序员学习路线图

热门文章

  1. 景嘉微变更会计师事务所引发投资者担忧
  2. 计算机共享文件登录人员记录,如何查看共享文件夹的访问记录,查看共享文件访问日志?...
  3. C盘系统文件提示损坏怎么办?系统文件损坏怎么修复
  4. 进化计算——进化规划(EP)
  5. c语言编程泰勒展开式计算,学习笔记:用c语言编写泰勒展开公式myexp()实现math.h.数学函数...
  6. 三维GIS显示中,利用太阳高度角和方位角计算光照
  7. Linux中断(interrupt)子系统之三:中断流控处理层(转)
  8. 初学者:关于html中的text-align文本居中属性详解
  9. 改进的树状长短期记忆网络(Tree-LSTM)语义表示
  10. 《数据结构》实验二 线性表的实验