前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sizeof(空类或空结构体)

sizeof(空类或空结构体)

作者头像
阳光岛主
发布2019-02-19 16:43:20
1.5K0
发布2019-02-19 16:43:20
举报
文章被收录于专栏:米扑专栏米扑专栏

某童靴前天去理想国际某公司面试,回来在宿舍讨论了这样一道题:

VC++里,有一个空类,没有声明任何成员变量或函数,请问此空类占多大字节空间?

A、 0           B、 1            C、 4           D、8

当时考虑了32bit和64bit机器,并且指针地址是int型,32bit占4个字节或64bit占8个字节,因此选了C和D

后又想想,这没有操作指针,也就不需内存对齐(视VC++编译器会自动进行对齐优化),排除了C和D,选择了A

当时也考虑过侯捷老师译著的那本《深度探索C++对象模型》,C++中继承与多态在编译器中是如何区分的,所以0字节也不靠谱

但至少也不会仅占一个字节吧,因此当时首先就把B彻底killed

面试回来,在VC6.0、 VS2010、 g++(Linux 2.6.31-14)上编译,发现结果居然是:1

首先,我贴出测试代码:

代码语言:javascript
复制
#include <iostream>
using namespace std;

// 空类
class ClassA
{
};

// 继承空类的空类
class ClassB : public ClassA
{
};

// 空结构体
struct StructC
{
};

// 主函数
int main(int argc, char **argv)
{
	cout<<"A: "<<sizeof(ClassA)<<endl;
	cout<<"B: "<<sizeof(ClassB)<<endl;
	cout<<"C: "<<sizeof(StructC)<<endl;

	return 0;
}

然后,在各编译器上编译

其结果分别如下:

VC6.0 (XP Professional SP2  -  32bit)

VS2010 (Win7 Ultimate SP1  -  64bit)

g++(Ubuntu linux 2.6.31-14  -  64bit)

最后,分析为何结果会是:1

这里,先看看C++多态的内部实现

例如,有三个重载函数:

int  add(int a, int b);

int add(int a, int b, int c);

float add(float a, float b);

C++编译器是如何上面三个函数呢?

_add_int_int

_add_int_int_int

_add_float_float

编译器压栈记录的是:函数名+参数类型+参数个数(注:返回值类型不足以区分多态)

知道了C++编译器如何处理和区分多态(重载类似)后,现在我们回到正题——sizeof(空类或空结构体)= 1

空类,没有任何成员变量或函数,即没有存储任何内容;

但是由于空类仍然可以实例化,即 ClassA A;  cout<<"sizeof(A): "<<sizeof(A)<<endl;

一个类能够实例化,编译器就需给它分配内存空间,来指示类实例的地址

这里编译器默认分配了一个字节(如:char),以便标记可能初始化的类实例,同时使空类占用的空间也最少(即1字节)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2011年07月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档