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

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

首先,我贴出测试代码:

#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字节)

转载于:https://www.cnblogs.com/wdpp/archive/2011/07/07/2386767.html

sizeof(空类或空结构体)相关推荐

  1. C++中的空类与空结构体大小

    今天面试遇到了一个很有意思的问题,即空结构体在C++中所占的内存大小是多少?参见如下代码: #include <iostream> struct S0 { };int main() {st ...

  2. 深拷贝与浅拷贝、空类与空数组

    一.深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝,如下图(v2 从 v 拷贝而来): 如果只是分配指针本身的内存,那就是浅拷贝,如下图: ...

  3. sizeof与offsetof有关的结构体详解

    sizeof与offsetof在程序中经常遇到,但在面试中其应用使得许多小伙伴吃闭门羹,被面试官问得哑口无言.接下来对两者的应用做详细介绍. 关于sizeof 定义 sizeof乃C/C++中的一个操 ...

  4. C++对类(或者结构体)中字符数组赋值时,出现表达式必须是可修改的左值的问题

    最近自己遇到了这类问题,在csdn上找到了很多大神给的解答,非常到位 特别感谢这位: https://blog.csdn.net/JQ_AK47/article/details/53169799 问题 ...

  5. 【Struct(结构体)杂谈之三】借我一双慧眼吧,让我把C++中Class(类)和Struct(结构体)看个清清楚楚明明白白...

    C++中Class(类)和Struct(结构体)的区别 之前一篇我们了解了C++中Struct的定义方法和C中有点不一样,而且增加了一种新的类型---Class.从 C++的名字我们就可以知道,C++ ...

  6. sizeof求值问题(结构体,数组,联合体,指针,函数)

    结构体的sizeof 结构体的sizeof涉及到字节对齐问题. 为什么需要字节对齐?计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了.为此,编译器默认会对结构体进行处理(实 ...

  7. C++类class和结构体struct区别

    在C++中,没有抛弃C语言中的struct关键字,其意义就在于给C语言程序开发人员有一个归属感,并且能让C++编译器兼容以前用C语言开发出来的项目. 在C++中,struct类似于class,在其中既 ...

  8. 枚举类 enum,结构体类 struct

    1.枚举类型的值,直观易于理解,见词知意. 格式: enum 枚举类名:值类型{值1,值2,值n} 每个值默认(省略":值类型")以int型数据存储,从0开始. 使用格式:枚举类名 ...

  9. Unix基本系统数据类型和stat结构体

    Unix基本系统数据类型 历史上,某些UNIX变量已与某些C数据类型联系在一起,例如,历史上主.次设备号存放在一个1 6位的短整型中, 8位表示主设备号,另外8位表示次设备号.但是,很多较大的系统需要 ...

  10. 【C】sizeof(空结构体/空类)的大小

    sizeof(空类/空结构体) = 1: #include <iostream> using namespace std; // 空类 class ClassA { }; // 继承空类的 ...

最新文章

  1. 2022-2028年中国光刻机行业深度调研及投资前景预测报告
  2. 修图动口不动手,有人把StyleGAN和CLIP组了个CP,能听懂修图指令那种
  3. CodeForces 721C Journey
  4. Spring定时器表达式
  5. 8. Python 数据类型
  6. 「第三篇」全国电子设计竞赛,这些你必须知道的比赛细节,文末附上近十年电赛题目下载...
  7. 微信小程序点击跳转出现背景
  8. 【前端基础知识】chrome安装React Devtools
  9. 在windows XP下如何用Vmware装Linux操作系统
  10. Ubuntu下convert命令将eps转pdf或者tif时出错的问题解决办法
  11. 针对金融级交易场景的严苛技术要求,如何修炼这门“必修课”?
  12. ubuntu显卡驱动下载安装
  13. pandas 中delete、drop函数的用法
  14. 怎么设置日程提醒时间
  15. 他只靠写代码,登上了胡润富豪榜!
  16. UVa 220 黑白棋 算法竞赛入门经典 习题4-3
  17. android 听筒模式外放模式的切换,YY项目之Android 听筒 扬声器 切换
  18. 为什么黑洞远程控制的屏幕传输比Radmin快
  19. 信息系统分析与设计-信息、管理与信息系统
  20. TestCenter测试管理工具功能详解五(J)

热门文章

  1. CentOS 修改默认语言
  2. 女孩必读:打死不能嫁的36种男人
  3. xshell远程控制(连接)两个VMware同时启动的Linux操作系统
  4. java date只保留年月日_入门之JAVA爬虫
  5. 计算机一级天文小知识,不得了,天文知识增加了! | 第20期
  6. win10连接mq_Win10环境下配置RocketMQ
  7. Pivot与Center的区别
  8. Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler(23)
  9. c语言 graph,基于图(graph)的应用举例
  10. wine linux 目录,wine的安装与microsoft office在linux上的运行