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++中一个类(非继承类)对象,所占内存空间大小
离职后在家里带了半年多了,这半年多里没有编写过一行代码,倒是看过一些书,但是差不多也都是囫圃吞枣.房子也快要装修,也得赶快找一个工作了,不然养车,还要玩摄影,没收入的日子真是不好过啊.呵呵. 按惯例, ...
随机推荐
- nginx 引入外部文件
http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $ ...
- python:利用asyncio进行快速抓取
web数据抓取是一个经常在python的讨论中出现的主题.有很多方法可以用来进行web数据抓取,然而其中好像并没有一个最好的办法.有一些如scrapy这样十分成熟的框架,更多的则是像mechanize ...
- Linux android studio :'tools.jar' seems to be not in Android Studio classpath.
问题: 'tools.jar' seems to be not in Android Studio classpath.Please ensure JAVA_HOME points to JDK ra ...
- C++动态数组的实现
#include <iostream> using namespace std; int main() { int n; while(cin>>n) { ]; p[]=; p[ ...
- 动态弹球的实现 加入了多线程技术--javaSE游戏准备工作
任务描述:实现了动态弹球的功能,对于有弹球功能的SE游戏奠定了基础. package 运用线程技术的小球; import java.awt.*; import java.awt.event.*; im ...
- highchats与php结合生成动态统计图
series: [{ type: 'pie', name: 'Browser share', data: [ ['Firefox', 45.0], ['IE', 26.8], { name: 'Chr ...
- Android显示GIF动画完整示例(二)
MainActivity如下: package cc.testgif2; import android.os.Bundle; import android.app.Activity; /** * De ...
- stm32之中断系统
概述: 提供中断控制器,用于总体管理异常,称之为“嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC) VIC:中断管理器: NVIC:内嵌中断管 ...
- ios 判断,qq,银行卡,手机号,邮编,生日,数字,字符串,护照, email
http://blog.csdn.net/dyllove98/article/details/8635079 IdentifierValidator.h // // IdentifierValida ...
- php 登陆动作详解
<?php class LoginAction extends Action { function index(){ $this->display(); } function do_log ...