sizeof(空类或空结构体)
某童靴前天去理想国际某公司面试,回来在宿舍讨论了这样一道题:
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(空类或空结构体)相关推荐
- C++中的空类与空结构体大小
今天面试遇到了一个很有意思的问题,即空结构体在C++中所占的内存大小是多少?参见如下代码: #include <iostream> struct S0 { };int main() {st ...
- 深拷贝与浅拷贝、空类与空数组
一.深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝,如下图(v2 从 v 拷贝而来): 如果只是分配指针本身的内存,那就是浅拷贝,如下图: ...
- sizeof与offsetof有关的结构体详解
sizeof与offsetof在程序中经常遇到,但在面试中其应用使得许多小伙伴吃闭门羹,被面试官问得哑口无言.接下来对两者的应用做详细介绍. 关于sizeof 定义 sizeof乃C/C++中的一个操 ...
- C++对类(或者结构体)中字符数组赋值时,出现表达式必须是可修改的左值的问题
最近自己遇到了这类问题,在csdn上找到了很多大神给的解答,非常到位 特别感谢这位: https://blog.csdn.net/JQ_AK47/article/details/53169799 问题 ...
- 【Struct(结构体)杂谈之三】借我一双慧眼吧,让我把C++中Class(类)和Struct(结构体)看个清清楚楚明明白白...
C++中Class(类)和Struct(结构体)的区别 之前一篇我们了解了C++中Struct的定义方法和C中有点不一样,而且增加了一种新的类型---Class.从 C++的名字我们就可以知道,C++ ...
- sizeof求值问题(结构体,数组,联合体,指针,函数)
结构体的sizeof 结构体的sizeof涉及到字节对齐问题. 为什么需要字节对齐?计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了.为此,编译器默认会对结构体进行处理(实 ...
- C++类class和结构体struct区别
在C++中,没有抛弃C语言中的struct关键字,其意义就在于给C语言程序开发人员有一个归属感,并且能让C++编译器兼容以前用C语言开发出来的项目. 在C++中,struct类似于class,在其中既 ...
- 枚举类 enum,结构体类 struct
1.枚举类型的值,直观易于理解,见词知意. 格式: enum 枚举类名:值类型{值1,值2,值n} 每个值默认(省略":值类型")以int型数据存储,从0开始. 使用格式:枚举类名 ...
- Unix基本系统数据类型和stat结构体
Unix基本系统数据类型 历史上,某些UNIX变量已与某些C数据类型联系在一起,例如,历史上主.次设备号存放在一个1 6位的短整型中, 8位表示主设备号,另外8位表示次设备号.但是,很多较大的系统需要 ...
- 【C】sizeof(空结构体/空类)的大小
sizeof(空类/空结构体) = 1: #include <iostream> using namespace std; // 空类 class ClassA { }; // 继承空类的 ...
最新文章
- 2022-2028年中国光刻机行业深度调研及投资前景预测报告
- 修图动口不动手,有人把StyleGAN和CLIP组了个CP,能听懂修图指令那种
- CodeForces 721C Journey
- Spring定时器表达式
- 8. Python 数据类型
- 「第三篇」全国电子设计竞赛,这些你必须知道的比赛细节,文末附上近十年电赛题目下载...
- 微信小程序点击跳转出现背景
- 【前端基础知识】chrome安装React Devtools
- 在windows XP下如何用Vmware装Linux操作系统
- Ubuntu下convert命令将eps转pdf或者tif时出错的问题解决办法
- 针对金融级交易场景的严苛技术要求,如何修炼这门“必修课”?
- ubuntu显卡驱动下载安装
- pandas 中delete、drop函数的用法
- 怎么设置日程提醒时间
- 他只靠写代码,登上了胡润富豪榜!
- UVa 220 黑白棋 算法竞赛入门经典 习题4-3
- android 听筒模式外放模式的切换,YY项目之Android 听筒 扬声器 切换
- 为什么黑洞远程控制的屏幕传输比Radmin快
- 信息系统分析与设计-信息、管理与信息系统
- TestCenter测试管理工具功能详解五(J)
热门文章
- CentOS 修改默认语言
- 女孩必读:打死不能嫁的36种男人
- xshell远程控制(连接)两个VMware同时启动的Linux操作系统
- java date只保留年月日_入门之JAVA爬虫
- 计算机一级天文小知识,不得了,天文知识增加了! | 第20期
- win10连接mq_Win10环境下配置RocketMQ
- Pivot与Center的区别
- Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler(23)
- c语言 graph,基于图(graph)的应用举例
- wine linux 目录,wine的安装与microsoft office在linux上的运行