空结构体(类)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;