`
king_tt
  • 浏览: 2100870 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    sizeof求struct结构体内存大小的问题

    该文件详细介绍了用sizeof求取struct结构体内存大小的各种情况

    sizeof(结构体)和内存对齐

    sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐

    sizeof与结构体和共同体.PDF

    sizeof与结构体和共同体.PDF 特别特别难找的一本书,不下会后悔的

    sizeof进行结构体大小的判断.

    sizeof进行结构体大小的判断.sizeof进行结构体大小的判断.sizeof进行结构体大小的判断.

    一种快速清空结构体的方法

    // 将结构体的起始地址进行强制转型,传入起始地址,用sizeof函数求出结构体的大小。} 这个算法比较简单,也没什么含量。但是希望大家有什么好的算法,也分享出来给大家,大家一起学习进步。

    字节对齐与结构体大小

    结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对sizeof我们将在另一篇文章中...

    详解C++ sizeof(下)

    sizeof作用于基本数据类型,在特定的平台和特定的...这是因为结构体或类成员变量具有不同类型时,需进行成员变量的对齐。《计算机组成原理》一书中说明,对齐的目的是减少访存指令周期,提高CPU存储速度。 1.1内存对齐

    结构体大小-详解内存对齐问题

    该文档提供了详细解决结构体sizeof问题,从结构体内变量所占空间大小,默认内存对齐大小,强制内存对齐方法,变量在内存中布局的详细分析,语言言简意赅,绝无废话,为读者解决了大量寻找书籍的烦恼,读者可以花费几分钟的...

    个人整理sizeof()用法汇总

    而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。 2.指针与静态数组的sizeof操作 指针均可看为变量类型的一种。所有指针变量的sizeof 操作结果均为4。 注意:int *p; sizeof(p)=4...

    sizeof详细总结

    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 *...

    c++里初始化结构体的一个比较的简单方法

    //常用方法 struct MYSTRUCT ...{ int i,j,q; char szName[15]; MYSTRUCT() ...{ i = j = q = 0; memset(szName,0,sizeof(szName)); } }; //我想的方法 一个初始化结构体比较省事的方法

    C/C++结构体字节对齐详解

    结构体的sizeof  先看一个结构体:  struct S1  {  char c;  int i;  };  sizeof(s1)在VC6中按默认设置得到的结果为8。  我们先看看sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数...

    sizeof_xiang_jie.rar_sizeof

    详细解释sizeof,包含基本数据类型的,结构体的,以及联合体指针的sizeof

    C语言结构体对齐.pdf

    C 语言结构体对齐也是老生常谈的话题了。基本上是面试题的必考题。内容 虽然很基础,但一不小心就会弄错。写出一个 struct,然后 sizeof,你会不会经 常对结果感到奇怪? sizeof的结果往往都比你声明的变量总长度要...

    基础电子中的如何计算结构体的大小

     运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4。基本数据类型的大小很好计算,我们来看一下如何计算构造数据类型的大小。  C语言中的构造数据类型有三种:数组、...

    详解C语言的结构体中成员变量偏移问题

    结构体所占的总字节数即sizeof()函数返回的值必须是最大成员的长度的整数倍,否则要进行“末尾填充”; c.若结构体A将结构体B作为其成员,则结构体B存储的首地址的偏移量必须为B中所含成员数据长度最大值的整数倍...

    C语言介绍sizeof的使用方法,可以直接编译使用

    此程序中的关键是sizeof运算符,它是C语言的内建运算符,用于获取特定类型或特定变量在内存中的大小(以字节为单位)。sizeof能用于任何数据类型,无论是内置类型(如int、char等),还是用户自定义类型(如结构体)...

    C++结构体里面string类型赋值问题

    q=(struct temp*)malloc(sizeof(struct temp)); q-&gt;s=p; }  上述那种情况的赋值会导致程序中断  需要用用new来分配内存,malloc不会调用结构函数  结构体内的string不定长,不能动态分配内存。 #include ...

Global site tag (gtag.js) - Google Analytics