我写过这个小程序:
#include <iostream>
using namespace std;
class a{
};
int main ()
{
a *obj=new a();
cout<<sizeof(obj)<<endl;
cout<<sizeof(*obj)<<endl;
delete obj;
}
以下是我得到的输出:
> ./a.out
4
1
>
我可以理解它使用4个字节来存储对象的地址。 但我不明白的是1个字节。 因为它是一个空类,所以我怀疑这个1字节的目的是什么(对象的大小)。
我的第二个问题是是否会调用默认构造函数? 如果是的话它基本上会做什么?
答案 0 :(得分:1)
字节在那里,因为在C ++中对象的大小不能是0
。这是一个虚拟字节。考虑一组a
- 如果a
的大小为0
,则所有对象都位于同一地址。
理论上,调用一个空的默认构造函数。在实践中,它被优化了,因为它没有可观察到的行为。
答案 1 :(得分:0)
第一个sizeof
在32位系统中输出32位指针的大小。第二个sizeof
打印出a
内容的大小,该内容与1个字节对齐,因为不同的对象必须在不同的地址中创建。
但是,即使使用非虚拟方法:
,您也可以使用零大小类class A
{
A()
{
cout << "Hi" << endl;
}
char unused[];
// Note: Putting at least a virtual method increases the size to 4 bytes.
};
和
cout << sizeof(A) << endl; // Prints out 0
此外,此代码显示所有A
个对象位于相同的内存地址中:
A a1;
A a2;
cout << &a1 << endl;
cout << &a2 << endl;
输出:
0x22ff00
0x22ff00
答案 2 :(得分:0)
每个对象必须具有不同的地址,因此C ++中的对象的最小大小为1.
默认构造函数不执行任何操作。
答案 3 :(得分:0)
该1字节(对象大小)的目的是什么
在C ++中,所有不同的对象必须具有不同的地址。为了实现这一点,所有对象至少与最小可寻址单元一样大 - 即一个字节。
我的第二个问题是是否会调用默认构造函数?
技术上,是的。如果您没有声明自己的默认构造函数,那么如果需要,将隐式生成一个构造函数。隐式构造函数将默认构造所有成员和基础子对象。然而...
如果是,它基本上会做什么?
由于该类没有需要初始化的成员或子对象,因此隐式构造函数琐事:它什么都不做。