C++类的大小——sizeof()
来源:互联网 发布:js map转json字符串 编辑:程序博客网 时间:2024/06/06 14:12
先看这么个问题——已知:
{
int a;
char *p;
};
那么运行cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl;之后输出什么?
这个应该很简单,两个成员变量所占的大小有嘛——8。可由时候人就是爱犯这个错误:这么简单的问题人家会问你?再想想……好像C++类里面有个什么函数指针,也应该占字节吧!?什么指针来着?忘了(还是水平低不扎实)!流汗中……算了姑且认为是构造函数和析构函数吧。一人一个加上刚才那8个16个。好笑吗?这是我犯的错误!!!到底C++类的sizeof是多少呢?没有所谓的函数指针问题吗?不甘心,编个例子看看:
第一步:给丫来个空的(不好意思上火粗鲁了)
{
};
运行cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl;
sizeof(CBase)=1;
为什么空的什么都没有是1呢?查资料……查啊查……OK这里了:先了解一个概念:类的实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样空类也会被实例化(别拿豆包不当干粮,空类也是类啊),所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。继续下一步:
第二步:
还是最初的那个类,运行结果:sizeof(CBase)=8
没什么说的,两个内部变量的大小。难道我记错了没有什么指针问题的存在?再试试(早这么有求知欲也不会丢人了,这回来劲了)
第三步:添个虚函数
{
public:
CBase(void);
virtual ~CBase(void);
private:
int a;
char *p;
};
再运行:sizeof(CBase)=12
嗨!问题出来了!!跟虚函数有关。为什么呢?查资料ing……
有了:“C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节”噢原来如此害死我了。那么继承类呢?
第四步:
基类就是上面的了不写了
public CBase
{
public:
CChild(void);
~CChild(void);
private:
int b;
};
运行:cout<<"sizeof(CChild)="<<sizeof(CChild)<<endl;
输出:sizeof(CChild)=16;
可见子类的大小是本身成员变量的大小加上子类的大小。
有空再补一下关于虚函数指针的知识吧。
- 类的大小—sizeof
- C++:类的大小(sizeof)
- C++类的大小——sizeof()
- C++类的大小——sizeof()
- C++类的大小——sizeof()
- C++类的大小——sizeof()
- C/C++ sizeof函数解析——解决sizeof求结构体大小的问题
- C/C++ sizeof函数解析——解决sizeof求结构体大小的问题
- 类的sizeof大小
- 类的大小(sizeof)
- sizeof(类)的大小
- 类的大小——sizeof 的研究(1)
- 类的大小——sizeof 的研究
- 【转】类的大小——sizeof 的研究(1)
- 类的大小——sizeof 的研究
- 【转】类的大小——sizeof 的研究
- 类的大小——sizeof 的研究(1)
- 类的大小——sizeof 的研究(1)
- 介绍一个全球语言翻译网站
- 在asp.net中长内容自动分页的实现
- C# 值类型与类的不同
- Linux下安装Red5 0.7
- adobe air for flex(利用blazeds连接远程java服务)
- C++类的大小——sizeof()
- 对于oracle进行简单树查询(递归查询)
- JTable使用
- linux下rar工具
- C#的一些常用文件操作方法[极好]
- JBOSS部署:The method getJspApplicationContext(ServletContext) is undefined for the type
- 端口
- java定时器的使用
- 安装SKYEYE的错误解决