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

1)C++对象大小计算相关推荐

  1. 计算 java_两种计算Java对象大小的方法(转)

    原文:http://blog.csdn.net/iter_zc/article/details/41822719 另一篇类似文章:http://www.cnblogs.com/magialmoon/p ...

  2. 聊聊JVM(三)两种计算Java对象大小的方法

    普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐 ...

  3. java统计空间占用_JVM —— Java 对象占用空间大小计算

    引用类型(reference type: Integer)在 32 位系统上每一个占用 4bytes(即32bit, 才干管理 2^32=4G 的内存), 在 64 位系统上每一个占用 8bytes( ...

  4. Java对象内存大小计算

    背景 今天办公室两个人事妹子因为一道Java试题各持己见,誓死捍卫自己的答案(对,是HR没错 -- 程序猿快没活路了). 题:字符串 "7天学会JAVA" 占用的内存空间是 ( ) ...

  5. Java对象内存空间大小计算

    一.查看基础类型的对象内存大小 八股文中很明确的告诉你了基础类型的大小 ,如下图: 类型 值大小(byte) 对象内存大小(byte) 备注 byte 1 16 char 2 16 int 4 16 ...

  6. JVM —— Java 对象占用空间大小计算

    零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 需要知道缓存的对象是否会超过 JVM 最大堆限制, 如果会超 ...

  7. instrumentation java_使用Instrumentation计算java对象大小

    对象大小的计算 正如笔者看的这篇文章所描述的一样,当我们试图获取一个JVM中的对象实际占用的空间大小时.通常使用的方法是徒手计算,或者通过gc计算前后内存差来估计对象大小.而今天要介绍的方法--利用I ...

  8. Lucene 计算对象大小

     Lucene通过RamUsageEstimator类提供的方法来粗略的(roughly)估算Java对象在内存中的大小.计算对象大小的主要目的是配合flush策略将内存中的索引信息同步到磁盘,flu ...

  9. Java 中对象占用内存大小计算

    原文地址 mp.weixin.qq.com byte 与 bit bit:位,比特.信息的最小单位,二进制数中的一个位数 (二进制位),其值为"0" 或"1": ...

最新文章

  1. c++ include 路径_头文件中,#include使用引号“”和尖括号lt;gt;有什么区别?
  2. 什么是mysql分发版_MySQL:使用源码分发版还是二进制分发版
  3. 微信小程序销毁某一注册函数_微信小程序 生命周期函数详解
  4. ServiceMash服务网格--理解lstio/envoy
  5. 背包问题 装箱问题 货盘装填问题 区别
  6. 使用 PDO 方式将 Session 保存到 MySQL 数据中
  7. select默认选中及赋值问题
  8. tf.sigmoid
  9. java 将多个文件打包成压缩包下载
  10. 【Lesson 3】 小调音阶及小调和弦
  11. Vue3中如何进行页面局部刷新,组件刷新
  12. ubuntu14.04下安装图片编辑软件pinta
  13. 计算机基础课程听课记录,听课记录-计算机应用基础
  14. linux下usb转串口驱动分析
  15. STM32F103C8T6接入机智云平台,实现器件多点操控
  16. HIT校园网ps4联机教程
  17. C++画图之GOC编程 第6课 通天云梯
  18. 一些 刊号期号计算方式
  19. Kafka-Eagle 2.0.5安装
  20. java 简历面试经验总结

热门文章

  1. 从零开始学视觉Transformer(5):如何训练ViT模型、DeiT算法解析
  2. for相关 java_Java学习之for循环相关知识梳理
  3. java 强制清除缓存_IDEA强制清除Maven缓存的方法示例
  4. 剑指offer:22-25记录
  5. 你的代码是否按照高内聚、低耦合的原则来设计的?
  6. Linux(12)-命令行的使用,shell脚本
  7. Linux(11)--(历史命令)Ctrl+r, history,!
  8. 算法(14)-leetcode-explore-learn-数据结构-二叉树的遍历
  9. php 不同时区时间转换,在PHP中将DateTime字符串转换为不同的时区
  10. Socket通信 客户端加密数据,传递数据密文到服务端,服务端解密密文 输出明文