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下如何修改文件的时间(全平台修改)
提供一个全平台修改文件的时间的方法,希望大家喜欢 /* UTIME.C: This program uses _utime to set the * file-modification time to ...
- java 抽象类与接口的区别 整理
抽象类与接口的区别 抽象类 包含抽象方法的类就是抽象类,声明的语句:abstract class 必须是public protected 接口 对行为的抽象,声明语句:interface 抽象方法的修 ...
- FLASH ROM与EEPROM的区别
EEPROM,虽然也叫“非易失性数据存储器”,但它不能直接参与ALU运算,只是用于掉电不丢失的数据存储. EEPROM和片内RAM 类似,也属于数据存储器,它的特点是数据掉电可保持,而程序存储器一般指 ...
- 1297 - Largest Box(三分)
1297 - Largest Box PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB In t ...
- switch case ,while, do while,enum
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace C_编辑 ...
- 最新Android ADT, SDK, SDK_tool等官方下载说明(及时更新)
1.Android SDK starter package SDK starter package http://dl.google.com/android/installer_r08-windows ...
- STL之vector详解
一.vector容器的自增长 首先,我们知道vector容器是由数组做出来的:它具备了数组的优缺点. 数组的优点: 操作数据,读取速度很快,因为有下标: 数组的缺点: 分配之后不能在改变大小: #in ...
- RBAC - 基于角色的权限控制
ThinkPHP中关于RBAC使用详解 自己的源码下载:百度网盘,thinkPHP文件夹下,RBAC文件夹. 重要的是,权限信息的写入函数等.在源码中能找到,Modules/Amin/Common/c ...
- [Swust OJ 1094]--中位数(巧用set,堆排序)
题目链接:http://acm.swust.edu.cn/problem/1094/ Time limit(ms): 1000 Memory limit(kb): 32768 中位数(又称中值,英 ...
- XHTML 基础(含部分css)
基于http://www.ycku.com/xhtml/ 的视频教程的一些笔记 关于xhtml的解释 引用百度百科 可扩展超文本标记语言,是一种置标语言,表现方式与超文本标记语言(HTML)类似,不过 ...