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