有人能说出在C ++中输出以下代码的确切原因吗?我收到的代码输出包含在标题注释中。它与虚拟表和v指针有什么关系。
/* sizeof(Empty) 1
sizeof(Derived1) 1
sizeof(Derived2) 8
sizeof(Derived3) 1
sizeof(Derived4) 16
sizeof(Dummy) 1
*/
#include <iostream>
using namespace std;
class Empty
{};
class Derived1 : public Empty
{};
class Derived2 : virtual public Empty
{};
class Derived3 : public Empty
{
char c;
};
class Derived4 : virtual public Empty
{
char c;
};
class Dummy
{
char c;
};
int main()
{
cout << "sizeof(Empty) " << sizeof(Empty) << endl;
cout << "sizeof(Derived1) " << sizeof(Derived1) << endl;
cout << "sizeof(Derived2) " << sizeof(Derived2) << endl;
cout << "sizeof(Derived3) " << sizeof(Derived3) << endl;
cout << "sizeof(Derived4) " << sizeof(Derived4) << endl;
cout << "sizeof(Dummy) " << sizeof(Dummy) << endl;
return 0;
}
答案 0 :(得分:4)
首先,即使没有成员的类也必须具有非零大小。标准坚持这一点。否则指针算术和数组将不起作用,因为零大小的类的数组将其所有元素放在同一个地方!
其他尺寸不同的事实很可能是由于v表。但是标准中没有明确强制要求,因此表明编译器处理事物的方式。
另请注意,多态性要求在基类中定义至少一个虚方法。这说明sizeof(Derived1)
与基类的大小相同。
答案 1 :(得分:2)
大小的差异是因为编译器添加了<%= check_boxes_tag "eyecolor[]", options_for_select(@eyecolor, params['eyecolor']),{:multiple => true,:size=>5} %>
。
vptr
,这是因为根据C ++标准,空类总是占用1个字节的内存。
sizeof(Derived1) = 1
,因为它继承了虚拟基类Derived1,所以编译器(sizeof(Derived2) = 8
位机器上的sizeof(vptr) = 8
)添加了一个vptr,因此64
是显示8个字节。
sizeof(Derived2)
因为sizeof(Derived3) = 1
的1个字节。
char
,虚拟继承的内部实现完全依赖于编译器,因此您可以看到16个字节的大小。
sizeof(Derived4) = 16
因为它包含一个char实体。
答案 2 :(得分:2)
Empty
的大小为1,因为每个对象的大小必须至少为1。
Derived1
的大小为1。
Derived2
的大小为8,因为您的编译器需要8个字节用于虚拟继承(可能是指针)。
Derived3
的大小为1,因为您的编译器已应用&#34;空基类&#34;优化
Derived4
的大小为16,因为虚拟继承所需的8个字节使对象需要8字节对齐。
Dummy
的大小为1,因为它的大小为char
。