某童靴前天去理想国际某公司面试,回来在宿舍讨论了这样一道题:
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求取struct结构体内存大小的各种情况
sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐
sizeof与结构体和共同体.PDF 特别特别难找的一本书,不下会后悔的
sizeof进行结构体大小的判断.sizeof进行结构体大小的判断.sizeof进行结构体大小的判断.
// 将结构体的起始地址进行强制转型,传入起始地址,用sizeof函数求出结构体的大小。} 这个算法比较简单,也没什么含量。但是希望大家有什么好的算法,也分享出来给大家,大家一起学习进步。
结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对sizeof我们将在另一篇文章中...
sizeof作用于基本数据类型,在特定的平台和特定的...这是因为结构体或类成员变量具有不同类型时,需进行成员变量的对齐。《计算机组成原理》一书中说明,对齐的目的是减少访存指令周期,提高CPU存储速度。 1.1内存对齐
该文档提供了详细解决结构体sizeof问题,从结构体内变量所占空间大小,默认内存对齐大小,强制内存对齐方法,变量在内存中布局的详细分析,语言言简意赅,绝无废话,为读者解决了大量寻找书籍的烦恼,读者可以花费几分钟的...
而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。 2.指针与静态数组的sizeof操作 指针均可看为变量类型的一种。所有指针变量的sizeof 操作结果均为4。 注意:int *p; sizeof(p)=4...
1、定义与语法 2、语法形式 3、基本数据类型的sizeof值 4、指针变量的sizeof值 5、数组的sizeof值 6、结构体的sizeof值(★★★★★) 7、含位域结构体的sizeof
学习结构体排序查找以及链表的使用#include #include #include struct student { int num; double score; char name[100]; struct student *next; }; int cmp(const void *a,const void *b) { struct student *...
//常用方法 struct MYSTRUCT ...{ int i,j,q; char szName[15]; MYSTRUCT() ...{ i = j = q = 0; memset(szName,0,sizeof(szName)); } }; //我想的方法 一个初始化结构体比较省事的方法
结构体的sizeof 先看一个结构体: struct S1 { char c; int i; }; sizeof(s1)在VC6中按默认设置得到的结果为8。 我们先看看sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数...
详细解释sizeof,包含基本数据类型的,结构体的,以及联合体指针的sizeof
C 语言结构体对齐也是老生常谈的话题了。基本上是面试题的必考题。内容 虽然很基础,但一不小心就会弄错。写出一个 struct,然后 sizeof,你会不会经 常对结果感到奇怪? sizeof的结果往往都比你声明的变量总长度要...
运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4。基本数据类型的大小很好计算,我们来看一下如何计算构造数据类型的大小。 C语言中的构造数据类型有三种:数组、...
结构体所占的总字节数即sizeof()函数返回的值必须是最大成员的长度的整数倍,否则要进行“末尾填充”; c.若结构体A将结构体B作为其成员,则结构体B存储的首地址的偏移量必须为B中所含成员数据长度最大值的整数倍...
此程序中的关键是sizeof运算符,它是C语言的内建运算符,用于获取特定类型或特定变量在内存中的大小(以字节为单位)。sizeof能用于任何数据类型,无论是内置类型(如int、char等),还是用户自定义类型(如结构体)...
q=(struct temp*)malloc(sizeof(struct temp)); q->s=p; } 上述那种情况的赋值会导致程序中断 需要用用new来分配内存,malloc不会调用结构函数 结构体内的string不定长,不能动态分配内存。 #include ...