空结构体(类)的大小

来源:互联网 发布:积分商城软件文档 编辑:程序博客网 时间:2024/05/20 04:10

空结构体(类)sizeof的返回值?

我首先想到的是既然结构体里面没有操作,也就是没有定义变量,那么没有占用空间,应该是0。

可是如果是0,在内存中又如何找这个结构体呢?

于是用代码试了一下

#include<iostream>using namespace std;struct A {};class B {};int main(){cout << sizeof(A) << endl;cout << sizeof(B) << endl;    return 0;}
运行的结果为:1

                            1

好奇怪!为什么没有变量还要分配空间?又为什么只分配一个空间?

由于空类仍然可以实例化,即 ClassA A;  cout<<"sizeof(A): "<<sizeof(A)<<endl; 

一个类能够实例化,编译器就需给它分配内存空间,来指示类实例的地址

这里编译器默认分配了一个字节(如:char),以便标记可能初始化的类实例,同时使空类占用的空间也最少(即1字节)

那如果是代码这样的呢?

class B {int printf() { cout << "B"; }};int main(){cout << sizeof(A) << endl;cout << sizeof(B) << endl;    return 0;}
运行结果:1
对象的大小是其数据成员所占的空间只和,而函数是该类对象通用的,所以不在对象的储存空间里。

但对于虚函数就会是不一样的情况。

#include<iostream>using namespace std;class B {int printf() { cout << "B"; }};class C {virtual int printf() { cout << "C"; }};int main(){cout << sizeof(B) << endl;cout << sizeof(C) << endl;    return 0;}
运行结果为:1

                        4

这是因为C中含有虚函数,编译器就要通过vptr找到虚函数表,这样内存中就会有int类型的指针,也就是说会占有4个字节的空间。
虚继承也是如此

class B{};class B2{};class C:public B{};class D:public virtual B{};class E:public B,public B2{};
sizeof(B)=1;sizeof(c)=1;sizeof(D)=4;sizeof(E)=1;