64位操作系统下类的sizeof计算

来源:互联网 发布:hadoop spark java 编辑:程序博客网 时间:2024/06/05 16:20

今天想温习下C++的东西,在fedora17下写了几个例程,运行结果令我大吃一惊

 

class C
{
        public:
                void f()
                {
                        cout << "Hello world in C class" << endl;
                }
        private:
                int a;
};

4 == sizeof(C)

 

class D
{
        public:
                virtual void vf1()
                {
                        cout << "Hello world in D class vf1" << endl;
                }
        private:
                int   a;
};

16 == sizeof(D)

 

为什么更换一个虚函数后类的大小变成了16字节

继续做实验

 

class E
{
        public:
                virtual void vf1()
                {
                        cout << "Hello world in E class vf1" << endl;
                }
};

8 == sizeof(E) 

 

看了以上结果,百思不得其解,后面想了下,是不是操作系统是64位,8字节的

运行uname -i

结果是x86_64

 

我和同事方俊讨论了下,根据现象可以判断,在64位系统下,如果类中有指针就会是8字节对齐

继续实验

在数据段加上一个数据指针

class C
{
        public:
                void f()
                {
                        cout << "Hello world in C class" << endl;
                }
        private:
                char c;
                int *b;
};

16 == sizeof(C)


class A
{
    void virtual va() = 0;
};
class B
{
void virtual vb() = 0;
};
class C : public A, public, B
{
    void va()
    {
        cout<<"in va."<<endl;
    }


    void vb()
    {
        cout<<"in vb."<<endl;
    }
            
};


int main(int argc, char *argv[])
{
    C tmpC;


    cout << sizeof(tmpC) << endl;
}


一个继承序函数就就增加一个虚表;

2×8=16

 

哈哈哈,今天的意外发现,还挺有意思的,在用baidu和google搜索了一下,还未发现同类文章,发表的网上,供大家参考,有问题可以发邮件来讨论15882206651@139.com

 

原创粉丝点击