1.在C++中空的结构体和类都是占用1个字节,这个1个字节是编译器的一个特殊处理。不然大家考虑下面的程序
A a;
A b;
cout<<&a<<endl;
cout<<&b<<endl;
假设空结构体和空类不占内存,那么对象a和对象b必然有相同的地址,不同的对象有相同地址,这就是很不合理的逻辑。
因此编译器做了一个特殊处理,类和结构体至少占用一个字节,
拥有虚函数的类其它大小至少为4,因为VPTR是指针需要占用4个字节。
classA
{
private:
int m_value;
public:
A(intvalue)
{
m_value=value;
}
void Print1()
{
printf("hello world");
}
void Print2()
{
printf("%d", m_value);
}
};
int main()
{
A*pA=NULL;
pA->Print1();
pA->Print2();
return 0;
}
2.这个问题考察应聘者对C++对象模型的掌握,在C++中,类中定义的成员变量和成员函数是分开存储的,所有成员函数,存储在代码段,而成员变量存储在栈或者堆。
了解这个对象模型后,就可以知道,print1中没有对成员变量进行访问,这样不会访问到系统预留的0地址区域,因此不会有错,而print2访问量成员变量,根据对象模型也就是访问了0地址区域,因此段错误。
classA
{
private:
int m_value;
public:
A(intvalue)
{
m_value=value;
}
void Print1()
{
printf("hello world");
}
virtual void Print2()
{
printf("hello world");
}
};
int main()
{
A*pA=NULL;
pA->Print1();
pA->Print2();
return 0;
}
3.在NULL地址处没有一个合法的对象,因此不会有一个合法的VPTR,因此在调用print2的时候,将会出现段错误,因为根据虚函数的原理,NULL开始的4个字节并不可能指向正在虚函数表,通过这4个字节进行函数调用只有死路一条。