sizeof(空类或空结构体)
来源:互联网 发布:计算机编程学校 编辑:程序博客网 时间:2024/05/16 18:51
某童靴前天去理想国际某公司面试,回来在宿舍讨论了这样一道题:
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字节)
- sizeof(空类或空结构体)
- sizeof(空类或空结构体)
- 空类或空结构
- 【常见面试题目C++系列】C++中空类和空结构体大小(sizeof)详谈
- sizeof空结构体长度
- sizeof(空类)
- sizeof空类是多少?
- 空类内存sizeof
- sizeof()一个空类
- 空结构体(空类)的size
- 空类和空结构体
- 空类与空结构体大小
- 空结构体和空类
- 空结构体和空类
- 空结构体和空类
- C/C++空结构体,空数组,空类作用
- 空结构体sizeof()获取的大小是多少
- sizeof(类名),空类大小
- 树状数组
- php中对上传到服务器的文件重命名
- 如何修改ubuntu系统的主机名
- python解决 'ascii' codec can't decode byte 0xe5 in position 3: ordinal not in range(128)
- 四种常见的鼠标事件
- sizeof(空类或空结构体)
- 4.7使用jar文件
- DBF文件结构
- 1048. Inverso
- lds文件分析
- Android模拟器相关操作设置
- 山寨手机风行6年开始退潮:华强北商家大批撤离
- 滚动条范围的计算
- File