1)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 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;
}
/*******************************************************************/
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++对象大小计算相关推荐
- 计算 java_两种计算Java对象大小的方法(转)
原文:http://blog.csdn.net/iter_zc/article/details/41822719 另一篇类似文章:http://www.cnblogs.com/magialmoon/p ...
- 聊聊JVM(三)两种计算Java对象大小的方法
普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐 ...
- java统计空间占用_JVM —— Java 对象占用空间大小计算
引用类型(reference type: Integer)在 32 位系统上每一个占用 4bytes(即32bit, 才干管理 2^32=4G 的内存), 在 64 位系统上每一个占用 8bytes( ...
- Java对象内存大小计算
背景 今天办公室两个人事妹子因为一道Java试题各持己见,誓死捍卫自己的答案(对,是HR没错 -- 程序猿快没活路了). 题:字符串 "7天学会JAVA" 占用的内存空间是 ( ) ...
- Java对象内存空间大小计算
一.查看基础类型的对象内存大小 八股文中很明确的告诉你了基础类型的大小 ,如下图: 类型 值大小(byte) 对象内存大小(byte) 备注 byte 1 16 char 2 16 int 4 16 ...
- JVM —— Java 对象占用空间大小计算
零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 需要知道缓存的对象是否会超过 JVM 最大堆限制, 如果会超 ...
- instrumentation java_使用Instrumentation计算java对象大小
对象大小的计算 正如笔者看的这篇文章所描述的一样,当我们试图获取一个JVM中的对象实际占用的空间大小时.通常使用的方法是徒手计算,或者通过gc计算前后内存差来估计对象大小.而今天要介绍的方法--利用I ...
- Lucene 计算对象大小
Lucene通过RamUsageEstimator类提供的方法来粗略的(roughly)估算Java对象在内存中的大小.计算对象大小的主要目的是配合flush策略将内存中的索引信息同步到磁盘,flu ...
- Java 中对象占用内存大小计算
原文地址 mp.weixin.qq.com byte 与 bit bit:位,比特.信息的最小单位,二进制数中的一个位数 (二进制位),其值为"0" 或"1": ...
最新文章
- c++ include 路径_头文件中,#include使用引号“”和尖括号lt;gt;有什么区别?
- 什么是mysql分发版_MySQL:使用源码分发版还是二进制分发版
- 微信小程序销毁某一注册函数_微信小程序 生命周期函数详解
- ServiceMash服务网格--理解lstio/envoy
- 背包问题 装箱问题 货盘装填问题 区别
- 使用 PDO 方式将 Session 保存到 MySQL 数据中
- select默认选中及赋值问题
- tf.sigmoid
- java 将多个文件打包成压缩包下载
- 【Lesson 3】 小调音阶及小调和弦
- Vue3中如何进行页面局部刷新,组件刷新
- ubuntu14.04下安装图片编辑软件pinta
- 计算机基础课程听课记录,听课记录-计算机应用基础
- linux下usb转串口驱动分析
- STM32F103C8T6接入机智云平台,实现器件多点操控
- HIT校园网ps4联机教程
- C++画图之GOC编程 第6课 通天云梯
- 一些 刊号期号计算方式
- Kafka-Eagle 2.0.5安装
- java 简历面试经验总结
热门文章
- 从零开始学视觉Transformer(5):如何训练ViT模型、DeiT算法解析
- for相关 java_Java学习之for循环相关知识梳理
- java 强制清除缓存_IDEA强制清除Maven缓存的方法示例
- 剑指offer:22-25记录
- 你的代码是否按照高内聚、低耦合的原则来设计的?
- Linux(12)-命令行的使用,shell脚本
- Linux(11)--(历史命令)Ctrl+r, history,!
- 算法(14)-leetcode-explore-learn-数据结构-二叉树的遍历
- php 不同时区时间转换,在PHP中将DateTime字符串转换为不同的时区
- Socket通信 客户端加密数据,传递数据密文到服务端,服务端解密密文 输出明文