C++ 为什么派生类的大小是8? #包括 使用名称空间std; 类空 {}; 派生类:虚拟公共空 { 字符c; }; int main() { cout

C++ 为什么派生类的大小是8? #包括 使用名称空间std; 类空 {}; 派生类:虚拟公共空 { 字符c; }; int main() { cout,c++,C++,大小取决于实现,这取决于特定的编译器实现如何实现虚拟化和填充。您不应该期望特定的值是什么。如果您想在程序中计算大小,只需使用sizeof,就可以了。大小取决于im执行。四个字节将用于vtable,一个字节用于字符,三个字节用于填充。这使得为8个字节。因此,这取决于编译器如何实现虚拟化和填充。如果您需要,可以使用sizeofnt来计算程序的大小vtable是四个字节,char是一个字节,padding是三个字节。为什么你认为应该是九个字节?你可能在32位平台上,所以隐藏在类中的vptr将是4个字节

大小取决于实现,这取决于特定的编译器实现如何实现虚拟化和填充。您不应该期望特定的值是什么。如果您想在程序中计算大小,只需使用
sizeof
,就可以了。

大小取决于im执行。四个字节将用于
vtable
一个字节用于
字符
三个字节用于
填充
。这使得为8个字节。因此,这取决于编译器如何实现虚拟化和填充。如果您需要,可以使用sizeofnt来计算程序的大小

vtable是四个字节,char是一个字节,padding是三个字节。为什么你认为应该是九个字节?你可能在32位平台上,所以隐藏在类中的vptr将是4个字节。这是我第一次看到继承列表中指定的
virtual
。这种语法合法吗?是否比不指定
virtual
更好/更安全?@VittorioRomeo是的,它是合法的。是否比不指定它更好/更安全取决于您是否需要虚拟基类。(请参阅:)不确定此处是否需要或使用vtable。虚拟基类偏移量也可以直接存储,也可以达到4字节。@MSalters:-是的,你是对的。但我认为答案的第一行更重要,它取决于实现。尽管我接受你的观点+1@OliCharlesworth:-那么使用sa是否正确是否为包含
vptr
的对象获取四个字节?
#include <iostream>
using namespace std;

class Empty
{};


class Derived : virtual public Empty
{
    char c;
};

int main()
{
    cout << "sizeof(Empty) " << sizeof(Empty) << endl;
    cout << "sizeof(Derived) " << sizeof(Derived) << endl;


    return 0;
}