c++中一个类所占用的空间
看到阿里的一道笔试题:
#pragma pack(2)
class A
{
int i;
union U
{
char buff[13];
int i;
}u;
void foo() { }
typedef char* (*f)(void*);
enum{red, green, blue} color;
}a;
答案应该是多少呢:24
因为对于u,占用的内存是16个字节,刚开始看这题的时候以为是14个字节,因为u要设定为每一个类型的整数倍,且能容纳类型变量字节的最大值
既然这样,我们顺便来总结一下c++中类的内存大小:
这是一个总结:
#include <iostream>
#include <iomanip> using namespace std; class A1//c++要求每个实例在内存中都有独一无二的地址,空类也会被实力化,编译器自动添加一个字节
{}; class A2
{
int a;
char p;
};
class A21//所有类型都小于处理器的大小,优化为最大类型的整数倍
{
int a;
char b;
char c[6];
}; class A22//单个字符存储,不会优化
{
char b;
char c[5];
};
class A23//double大于处理器位数,以处理器位数对齐
{
int a;
double b;
char c[2];
char d[7];
}; class B//含有虚函数的类中自动维护一个指向虚函数表的指针,大小为4字节
{
public:
B(){}
virtual ~B(){}
private:
int a;
char *b;
}; class C: public B
{
public:
C(){}
~C(){}
virtual void func();//父类和子类共享一个 vptr,而不管虚函数的个数
private:
int x;
}; int main()
{
cout<<"A1:"<<setw(4)<<sizeof(A1)<<endl;
cout<<"A2:"<<setw(4)<<sizeof(A2)<<endl;
cout<<"A21:"<<setw(4)<<sizeof(A21)<<endl;
cout<<"A22:"<<setw(4)<<sizeof(A22)<<endl;
cout<<"A23:"<<setw(4)<<sizeof(A23)<<endl;
cout<<"B:"<<setw(4)<<sizeof(B)<<endl;
cout<<"C:"<<setw(4)<<sizeof(C)<<endl; return 0;
}
对于c++关于继承层次的内存布局,准备去看《inside the c++ object module》
c++中一个类所占用的空间的更多相关文章
- C++中的类所占内存空间总结
C++中的类所占内存空间总结 最近在复习c++的一些基础,感觉这篇文章很不错,转载来,大家看看! 类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算 ...
- Android中一个类实现的接口数不能超过七个
近期一段时间,在开发Android应用程序的过程中,发现Android中一个类实现的接口数超过七个的时候,常常会出现超过第7个之后的接口不能正常使用.
- TypeToken 是google提供的一个解析Json数据的类库中一个类
Type listType = new TypeToken<LinkedList<User>>(){}.getType(); Type是java里的reflect包的Type ...
- C++中的类所占内存空间+继承中的成员访问控制
C++学习之继承中的成员访问控制 C++中的类所占内存空间总结
- C++中的类所占内存空间总结(转)
类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算在内的. 摘抄部分: 成员函数还是以一般的函数一样的存在.a.fun()是通过fun(a.this)来调 ...
- Linux内存管理 一个进程究竟占用多少空间?-VSS/RSS/PSS/USS
关键词:VSS.RSS.PSS.USS._mapcount.pte_present.mem_size_stats. 在Linux里面,一个进程占用的内存有不同种说法,可以是VSS/RSS/PSS/US ...
- MySQL中查询所有数据库占用磁盘空间大小和单个库中所有表的大小的sql语句
查询所有数据库占用磁盘空间大小的SQL语句: ,),' MB') as data_size, concat(,),'MB') as index_size from information_schema ...
- MySQL中查询所有数据库占用磁盘空间大小
查询所有数据库占用磁盘空间大小的SQL语句: 复制代码 代码如下:select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2), ...
- C++中一个类(非继承类)对象,所占内存空间大小
离职后在家里带了半年多了,这半年多里没有编写过一行代码,倒是看过一些书,但是差不多也都是囫圃吞枣.房子也快要装修,也得赶快找一个工作了,不然养车,还要玩摄影,没收入的日子真是不好过啊.呵呵. 按惯例, ...
随机推荐
- Qt 技巧: 解决未解析的SSL问题
因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com/product ...
- 【Java】:多线程下载
import java.io.InputStream; import java.io.RandomAccessFile; import java.net.URL; import java.net.UR ...
- cocos2dx进阶学习之CCSprite
继承关系 CCSprite -> CCNodeRGBA -> CCNode, CCRGBAProtocol CCTextureProtocol 从继承关系可以看出,CCSp ...
- IT第十九天 - 继承、接口、多态、面向对象的编程思想
IT第十九天 上午 继承 1.一般情况下,子类在继承父类时,会调用父类中的无参构造方法,即默认的构造方法:如果在父类中只写了有参的构造方法,这时如果在子类中继承时,就会出现报错,原因是子类继承父类时无 ...
- ligh@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.3
ligh@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.3
- BNU 沙漠之旅
http://www.bnuoj.com/bnuoj/problem_show.php?pid=29376 我直接暴力搜索的. 剪枝: 1.步骤最多只有4步,超过4步则退出 2.油的行程相加后的总和距 ...
- IIS7.0+SqlServer2012,进行.net网站发布的安装全过程
1..net3.5安装(sqlserver2012需要) 控制面板-->管理工具-->服务器管理器-->功能-->添加功能-->选择".NET Framewor ...
- Eclipse开启与关闭代码自动提示功能
Eclipse代码里面的代码提示功能默认是关闭的,只有输入“.”的时候才会提示功能,用vs的用户可能不太习惯 这种,vs是输入任何字母都会提示,下面说一下如何修改eclipse配置,开启代码自 ...
- python sqlalchemy-migrate 使用方法
1:下载相关模块 pip install sqlalchemy pip install sqlalchemy-migrate 2:创建model (model.py),这里用来绑定 ...
- zk leader选举自动完成
server 1: [root@wx03 bin]# ./zkServer.sh status ZooKeeper JMX enabled by default Using config: /zook ...