初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却 大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们一些基本的语法法则,但不会告诉我们为什么这么做?今天和大家谈的一点感悟就是我在学习编程过程中的一点经验,是编译器这方面的一个具体功能.

首先:我们要知道什么是类的实例化,所谓类的实例化就是在内存中分配一块地址.

那我们先看看一个例子:

#include<iostream.h>

class a {};
class b{};
class c:public a{
 virtual void fun()=0;
};
class d:public b,public c{};
int main()
{
 cout<<"sizeof(a)"<<sizeof(a)<<endl;
 cout<<"sizeof(b)"<<sizeof(b)<<endl;
 cout<<"sizeof(c)"<<sizeof(c)<<endl;
 cout<<"sizeof(d)"<<sizeof(d)<<endl;
 return  0;}

程序执行的输出结果为:

sizeof(a) =1

sizeof(b)=1

sizeof(c)=4

sizeof(d)=8

为什么会出现这种结果呢?初学者肯定会很烦恼是吗?类a,b明明是空类,它的大小应该为为0,为什么 编译器输出的结果为1呢?这就是我们刚才所说的实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以a,b的大小为1.

而类c是由类a派生而来,它里面有一个纯虚函数,由于有虚函数的原因,有一个指向虚函数的指针(vptr),在32位的系统分配给指针的大小为4个字节,所以最后得到c类的大小为4.

类d的大小更让初学者疑惑吧,类d是由类b,c派生迩来的,它的大小应该为二者之和5,为什么却是8  呢?这是因为为了提高实例在内存中的存取效率.类的大小往往被调整到系统的整数倍.并采取就近的法则,里哪个最近的倍数,就是该类的大小,所以类d的大小为8个字节.

当然在不同的编译器上得到的结果可能不同,但是这个实验告诉我们初学者,不管类是否为空类,均可被实例化(空类也可被实例化),每个被实例都有一个独一无二的地址.

我所用的编译器为vc++ 6.0.

下面我们再看一个例子.

#include<iostream.h>
class a{
pivate: 
int data;
};

class b{ 
private:
     int data;
  static int data1;
};
 int b::data1=0;
 void mian(){
 cout<<"sizeof(a)="<<sizeof(a)<<endl;
 cout<<"sizeof(b)="<<sizeof(b)<<endl;
}

执行结果为:

sizeof(a)=4;

sizeof(b)=4;

为什么类b多了一个数据成员,却大小和类a的大小相同呢?因为:类b的静态数据成员被编译器放在程序的一个global  data members中,它是类的一个数据成员.但是它不影响类的大小,不管这个类实际产生 了多少实例,还是派生了多少新的类,静态成员数据在类中永远只有一个实体存在,而类的非静态数据成员只有被实例化的时候,他们才存在.但是类的静态数据成员一旦被声明,无论类是否被实例化,它都已存在.可以这么说,类的静态数据成员是一种特殊的全局变量.

所以a,b的大小相同.

下面我们看一个有构造函数,和析构函数的类的大小,它又是多大呢?

#include<iostream.h>
class A{
public :
 A(int a){
  a=x;}
 void f(int x){
  cout<<x<<endl;}
 ~A(){}

private:
   int x;
   int g;
   };
class B{
public:
 private:
 int  data; int data2;
 static int xs;
};
int B::xs=0;
void  main(){
 A s(10);
 s.f(10);
 cout<<"sozeof(a)"<<sizeof(A)<<endl;
 cout<<"sizeof(b)"<<sizeof(B)<<endl;
}程序执行输出结果为:

10 ,

sizeof(a) 8

sizeof(b) 8

它们的结果均相同,可以看出类的大小与它当中的构造函数,析构函数,以及其他的成员函数无关,只与它当中的成员数据有关.

从以上的几个例子不难发现类的大小:

1.为类的非静态成员数据的类型大小之和.

2.有编译器额外加入的成员变量的大小,用来支持语言的某些特性(如:指向虚函数的指针).

3.为了优化存取效率,进行的边缘调整.

4 与类中的构造函数,析构函数以及其他的成员函数无关.

c++空类实例大小不是0原因相关推荐

  1. c语言格式对齐填充_C ++中类的大小 课堂上的填充和对齐| 派生类的大小

    c语言格式对齐填充 Prerequisite: 先决条件: sizeof() operator in C/C++ C / C ++中的sizeof()运算符 Size of struct in C C ...

  2. sizeof计算类的大小

    1 sizeof一个空类 class A { };cout<<sizeof(A)<<endl;//1 注:class A是一个空类型,它的实例不包含任何信息,本来求sizeof ...

  3. sizeof()来求一个类的大小

    基本概念 一个类的实例化对象所占空间的大小? 注意不要说类的大小,是类的对象的大小. 首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的. 用sizeof运算符对一个类型名操作,得 ...

  4. 空类,虚函数类,虚继承类的空间大小

    //此代码在32位win下运行成功 #include<iostream> using namespace std; class A//A是空类,编译器会用一个char类型标记这个类,大小为 ...

  5. C++中的空类与空结构体大小

    今天面试遇到了一个很有意思的问题,即空结构体在C++中所占的内存大小是多少?参见如下代码: #include <iostream> struct S0 { };int main() {st ...

  6. php怎样实现表格自动缩放字体,php实现在限定区域里自动调整字体大小的类实例,字体大小实例_PHP教程...

    php实现在限定区域里自动调整字体大小的类实例,字体大小实例 本文实例讲述了php实现在限定区域里自动调整字体大小的类.分享给大家供大家参考.具体如下: 这里的php类imagefittext.cla ...

  7. 【C】sizeof(空结构体/空类)的大小

    sizeof(空类/空结构体) = 1: #include <iostream> using namespace std; // 空类 class ClassA { }; // 继承空类的 ...

  8. c++对象长度之空类(1)

    在c++中说起对象,大家是不是很熟悉? 对象嘛,new一个不就行了嘛,对吧?(这里不说malloc,malloc它不负责触发构造函数,它也不是运算符,没法重载) 但当我们提到对象大小的时候,大家对怎么 ...

  9. 【C++】 为什么C++空类占一个字节

    00. 目录 00. 目录 01. 测试程序和结果分析 02. 单继承空白基类最优化问题 03. 多继承空白基类最优化问题 01. 测试程序和结果分析 测试程序如下: #include <ios ...

最新文章

  1. php 通知客户端,PHP+SSE服务器向客户端推送消息
  2. 【小白学PyTorch】扩展之Tensorflow2.0 | 21 Keras的API详解(下)池化、Normalization
  3. 野火Linux开发板接入华为云,Huawei_LiteOS——STM32F1移植(野火开发板)
  4. SpringBoot 路径访问控制
  5. boot spring test 文档_Spring、Spring Boot 和 TestNG 测试指南 ( 3 )
  6. 我的MarkDown入门
  7. python用户输入算式并计算_Python基础学习之计算和算式
  8. html按键变色,按键变色.html
  9. RxJava应该如何理解
  10. Ignite 配置更新Oracle JDBC Drive
  11. 多线程编程(4) - 从 CreateThread 说起[续二]
  12. hihoCoder 1369 网络流一·Ford-Fulkerson算法 (网络流学习#1 记录)
  13. 单片机交通灯灯c语言程序,关于LED模拟交通灯单片机C语言程序设计
  14. 2021-03-26,拉胯的三条命令,HappyCTFd
  15. charles4.0破解和手机抓包
  16. oppoA37m rom固件刷机包下载 免费下载 解锁专用
  17. 【Nginx】503 Service Temporarily Unavailable
  18. Android 禁止状态栏下拉
  19. 合泰HT32F52352 USART串口与电脑通信控制LED
  20. cmd如何切换到E盘

热门文章

  1. MapReduce的编程规范
  2. 【Homework】什么是多态,多态具体体现有哪些?
  3. 计算机声音处理说课稿,《声音的产生与传播》说课稿
  4. 学习oop知识之OOP的封装
  5. 浅谈JAVA中如何利用socket进行网络编程(二)
  6. VTK计算网格模型上的最短路径
  7. Linux文件系统之swap
  8. windows下oracle数据库自动备份脚本
  9. Android--静默安装
  10. 如何取消 DiscuzX 帖子被系统自动隐?