1)C++对象大小计算

C++对象的大小不同的编译器的实现是不一样的,以下仅讨论.net2003,其他编译的可能出现的结果以下也做了分析和猜测。在反推不同编译器实现的C++对象的大小时。对齐是一个很重要也容易被遗忘的问题。
  • class A{};      
    类A是一个空类,但是它的大小并不为0,编译期间编译器会插入一个char在其中,这个char我们是看不到的,这样的用处是保证生成的不同对象具有不同地址,就是要对象里有东西。
  • class B:public virtual A{};
    B类是对A类的虚继承,B中一般会有指向A的实例的指针,在IA-32下为4bytes。这里不同编译器的实现差别很大,有的编译器在B的对象中也     会保留A类的那个隐含的char,于是就有1+4=5个bytes,再考虑对齐,有些编译器产生的结果为8bytes,但是在.net2003中优化过了,不会有A中的char,也就不需要对齐,只有4bytes大
  • class C:public virtual A{};//同上
  • class D:public B,public C{};
      //D为8,如果编译器不优化A中的char就会有1(A)+8(B)+8(C)-4(B对A虚继承)-4(C对A虚继承)+3(对齐)=12bytes
  • class E{
          int i;
     };//很明显4bytes
  • class F{
          double d;
    };//很明显8bytes
  • class G{
          double num; 
          char in;   
    };//8bytes对齐,所以是8(double)+4(int)+4(对齐)=16
  • class H{
          int num; 
          double in;    
    };//同上
  • class I{
          int num; 
          double in;    
    public:
          virtual ~I(){};
    };//8(double)+4(int)+4(对齐)+4(vptr)+4(对齐)=24
  • class J{
          double num; 
          int in;     
    public:
          virtual ~J(){};
    };//同上8(double)+4(int)+4(对齐)+4(vptr)+4(对齐)=24
  • class K{
          int i;
          int k;
    public:
          virtual ~K(){};
    };//4(int)+4(int)+4(vptr)=12
  • class L{
          int i;
          int j;
          L(){};
    public:
          float ll(int i) {
                 return 0.0;
    }
  • static int hhh(int i) {
          return 0.0;
    }
virtual ~L(){};
virtual ji(){};
};
//虚函数表的指针vptr,只有类中出现虚函数才会出现,它指向虚函数表,所有虚函数的地址存放在此表中。
//4(int)+4(int)+4(vptr)=12从中看出,不管有多少虚函数,大小不变,因为类中之保存虚函数表。
//不管成员函数有多少,类大小也不变,因为他们不保存在对象中,无论是否是静态

int main(){
cout <<"A "<<sizeof(A)<<endl;
cout <<"B "<<sizeof(B)<<endl;
cout <<"C "<<sizeof(C)<<endl;
cout <<"D "<<sizeof(D)<<endl;
cout <<"E "<<sizeof(E)<<endl;
cout <<"F "<<sizeof(F)<<endl;
cout <<"G "<<sizeof(G)<<endl;
cout <<"H "<<sizeof(H)<<endl;
cout <<"I "<<sizeof(I)<<endl;
cout <<"J "<<sizeof(J)<<endl;
cout <<"K "<<sizeof(K)<<endl;
cout <<"L "<<sizeof(L)<<endl;
}
/*******************************************************************/
output .net2003
A 1
B 4
C 4
D 8
E 4
F 8
G 16
H 16
I 24
J 24
K 12
L 12

转载于:https://www.cnblogs.com/weilf/p/4156523.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OC之ARC环境中的循环strong问题

2019独角兽企业重金招聘Python工程师标准>>> main.m文件&#xff1a; #import <Foundation/Foundation.h> #import "Person.h" #import "Dog.h"int main() {Person *p [[Person alloc] init];Dog *d [[Dog alloc] init];p.dog d;d.per…

java metric_java版的Metric工具介绍

Metrics是一个给JAVA服务的各项指标提供度量工具的包&#xff0c;在JAVA代码中嵌入Metrics代码&#xff0c;可以方便的对业务代码的各个指标进行监控&#xff0c;同时&#xff0c;Metrics能够很好的跟Ganlia、Graphite结合&#xff0c;方便的提供图形化接口。基本使用方式直接将…

15_采用Pull解析器解析和生成XML内容

java还提供SAX和DOM用于解析XML Android还集成了Pull解析器——推荐 package cn.itcast.service;import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1…

Android自定义view之圆形进度条

本节介绍自定义view-圆形进度条思路&#xff1a;根据前面介绍的自定义view内容可拓展得之&#xff1b;1&#xff1a;新建类继承自View2&#xff1a;添加自定义view属性3&#xff1a;重写onDraw(Canvas canvas)4&#xff1a;实现功能下面上代码1.自定义view代码&#xff1a; pub…

java二级考试备考_2017计算机二级考试《JAVA》备考测试题「带答案」

2017计算机二级考试《JAVA》备考测试题「带答案」为确保同学们将所涉及的考点全面复习到位&#xff0c;让大家充满信心的步入考场&#xff0c;以下是百分网小编搜索整理的一份计算机二级考试《JAVA》备考测试题【带答案】&#xff0c;供参考练习&#xff0c;希望对大家有所帮助…

Thinkphp 关联模型和试图模型区别

关联模型主要在多表操作时使用&#xff0c;比如 user表&#xff0c;user_role表&#xff0c;role表 user_role字段&#xff1a;uid,rid&#xff0c;它作为中间表&#xff0c;负责将user和role之间的&#xff0c;1对1&#xff0c;1对多&#xff0c;多对多的关系进行保存。 这时要…

windows7下安装php的imagick和imagemagick扩展教程

这篇文章主要介绍了windows7下安装php的imagick和imagemagick扩展教程,同样也适应XP操作系统,Win8下就没测试过了,需要的朋友可以参考下 最近的PHP项目中&#xff0c;需要用到切图和缩图的效果&#xff0c;在linux测试服务器上很轻松的就安装好php imagick扩展。但是在本地wind…

java 线程间通信 handler_Handler不同线程间的通信

转http://www.iteye.com/problems/69457Activity启动后点击一个界面按钮后会开启一个服务(暂定为padService)&#xff0c;在padService中会启动一个线程(暂定为Thread-3)发起Socket连接。我们项目中使用mina作为socket通信框架&#xff0c;用过mina的同志们应该熟悉&#xff0c…

通过mysql show processlist 命令检查mysql锁的方法

作者&#xff1a; 字体&#xff1a;[增加 减小] 类型&#xff1a;转载 时间&#xff1a;2010-03-07show processlist 命令非常实用&#xff0c;有时候mysql经常跑到50%以上或更多&#xff0c;就需要用这个命令看哪个sql语句占用资源比较多&#xff0c;就知道哪个网站的程序问题…

java流类图结构_java学习之IO流(学习之旅,一)

个人在学习IO流的时候看到如下所示java 流类图结构的时候&#xff0c;我的感想是&#xff0c;这么多处于蒙的状态。Java流类图结构这么多&#xff0c;没有分类不好学&#xff0c;那我们就慢慢一口一口的吃&#xff0c;这样每天学习一点就好了&#xff0c;其实很多类并不是常用的…

php 安装xdebug扩展

php 扩展获取地址 http://pecl.php.net/package/ 编译安装的过程 wget http://pecl.php.net/get/xdebug-2.2.2.tgz tar -zxvf xdebug-2.2.2.tgz cd xdebug-2.2.2/ /data/klj/php/bin/phpize ./configure --enable-xdebug --with-php-config/data/klj/php/bin/php-config mak…

通过VB向SQL Server数据库中录入数据

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)一、数据录入通过VB向SQL Server数据库中录入数据&#xff0c;可以使用数据绑定控件录入数据与使用SQL语句录入1.利用数据绑定控件录入数据使用数据绑定控件录入数据可以运行较少的代码&…

拨打电话 java_简单拨打电话程序

众所周知,对于一个手机,能拨打电话是其最重要也是最常用的一个功能.而在Android里是怎么样实现拨打电话的程序呢?我在这里写了一个简单的拨打电话的Demo,供大家参考.一共分为5个步骤.Step 1:新建一个Android工程,命名为phoneCallDemo.Step 2:设计程序的界面,打开main.xml把内容…

Apple开发者账号申请学习方式

http://jingyan.baidu.com/article/414eccf610e7c76b431f0a94.html https://developer.apple.com/wwdc/schedule/转载于:https://www.cnblogs.com/wcLT/p/4167707.html

SQLite/嵌入式数据库

SQLite/嵌入式数据库 的项目要么不使用数据库&#xff08;一两个文配置文件就可以搞定&#xff09;&#xff0c;要么就会有很多的数据&#xff0c;用到 postgresql&#xff0c;操练sqlite的还没有。现在我有个自己的小测试例子&#xff0c;写个数据库对比的小项目例子&#xff…

python继承属性_Python中的属性继承问题

不久前&#xff0c;我在开发一个python应用程序&#xff0c;我在类中使用了很多属性&#xff0c;但是当我试图重写派生类中基类的访问器的行为时&#xff0c;我遇到了麻烦。这是我的问题的草图&#xff1a;class Person(object):propertydef name(self):return self._namename.…

王爽汇编语言实验十

实验十 3.数值显示(以下程序附带测试程序) 1 ;名称: dtoc2 ;功能: 将dword型数据转变为表示十进制数的字符串,字符串以0为结尾3 ;参数: (ax)dword型数据低字4 ; (dx)dword型数据高字5 ; ds:si指向字符串的首地址6 ;返回: 无7 assume cs:code8 data segment9…

WPF01(xaml)

XAML&#xff1a;&#xff08;转自http://www.cnblogs.com/huangxincheng/archive/2012/06/17/2552511.html&#xff09; <Window x:Class"WpfApplication1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"…

android源码包下载

http://rgruet.free.fr/public/其他下载地址&#xff1a;http://cid-b50f9d5897331c44.office.live.com/browse.aspx/Android技术群共享/source code 转载于:https://www.cnblogs.com/liangxiaofeng/p/4173340.html

java 线程 状态 图_Java提高——多线程(一)状态图

操作系统中的进程和线程的概念进程是指一个内存运行的应用程序&#xff0c;每个进程都有自己独立的一块内存空间&#xff0c;一个进程中可以启动多个线程&#xff0c;比如windows下的一个运行的应用程序.exe就是一个进程。线程是指进程中的一个执行流&#xff0c;一个进程可以运…