zoukankan      html  css  js  c++  java
  • 空类的sizeof,有一个虚函数的类的sizeof

    今天面试,忽然被问到这个题目,查了一下果然有欸。

    #include <iostream>
    using namespace std;
    class A
    {
    };
    
    class B
    {
    public:
        B() {}
        ~B() {}
    };
    
    class C
    {
    public:
        C() {}
        virtual ~C() {}
    };
    
    int main(int argc, _TCHAR* argv[])
    {
        cout<<sizeof(A)<<"	"<<sizeof(B)<<"	"<<sizeof(C)<<endl;
        return 0;
    }

    看看运行结果:

    注意,我的是64位机。

    再看看网上人家的解释:

    class A是一个空类型,它的实例不包含任何信息,本来求sizeof应该是0。但当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占用多少内存,由编译器决定。Visual Studio 2008中每个空类型的实例占用一个byte的空间。
     
    class B在class A的基础上添加了构造函数和析构函数。由于构造函数和析构函数的调用与类型的实例无关(调用它们只需要知道函数地址即可),在它的实例中不需要增加任何信息。所以sizeof(B)和sizeof(A)一样,在Visual Studio 2008中都是1。
     
    class C在class B的基础上把析构函数标注为虚函数。C++的编译器一旦发现一个类型中有虚函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。在32位的机器上,一个指针占4个字节的空间,因此sizeof(C)是4。

     当然,最后的class C看你的机器字长喽。

  • 相关阅读:
    「SAM」你的名字
    「疫期颓废」2
    「疫期颓废」1
    代码覆盖率简单介绍
    解决git报ssh variant 'simple' does not support setting port
    接口自动化基本流程和测试思路
    wait和sleep的区别
    vm垃圾回收算法的简单理解
    TCP-三次握手和四次挥手简单理解
    浏览器输入一个url 中间经历的过程
  • 原文地址:https://www.cnblogs.com/fallenmoon/p/7570707.html
Copyright © 2011-2022 走看看