zoukankan      html  css  js  c++  java
  • C++内存对齐

    class A

    {

    };

    sizeof(A)得到的不是0而是1,因为我们在申明类型实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例,

    具体占用多少内存由编译器决定,上面是我在VS2008上得出的结果。

    class A

    {

    char a;

    };

    这个sizeof出来的结果是1,不是4,在只有一个char型成员的情况下并没有内存对齐(VS2008)。

    class A

    {

    char a;

    char b;

    };

    得到2(没特别申明其他编译器就是VS2008)。

    class A

    {

    int a;

    char b;

    };

    得到8。

    class A

    {

    char c;

    int a;

    char b;

    };

    得到12。

    class A

    {

    int a;

    char b;

    char c;

    };

    得到8。

    上面的例子已经很清楚表明什么事内存对齐了...

    下面看看加入虚函数后的情况:

    class A
    {
    virtual void fun();
    };

    得到4,因为内含一个虚指针,一般的编译器默认把这个虚指针放到最后。

    class A
    {
    char a;
    virtual void fun();
    };

    得到8;

    class A
    {
    char a;
    virtual void fun();
    char b;
    };

    这样还是8。

    class A
    {
    int d;
    char a;
    virtual void fun();
    char b;
    };

    得到12。

    class A
    {
    char b;
    int d;
    char a;
    virtual void fun();

    };

    得到16。

    再来看看在继承中可能会出现的状况,Lippman在深度探索C++对象模型中给出了很多种情况,

    特别是涉及到虚拟继承和多继承时,我经验太少,现在还没见到。或者不适用被慢慢摒弃了吧。

    这里面涉及的内容太复杂了,跟编译器有关,不同的编译器策略不同,以后有机会在总结下。

    class A
    {
    char b;
    int d;
    virtual void fun();
    char a;

    };
    class B:public A
    {
    char h;
    virtual void test();
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
    cout<<sizeof(A)<<endl;
    cout<<sizeof(B)<<endl;

    }

    得到16,20

    class A
    {

    int d;
    virtual void fun();
    char a;
    char b;
    };
    class B:public A
    {
    char h;
    virtual void test();
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
    cout<<sizeof(A)<<endl;
    cout<<sizeof(B)<<endl;

    getchar();
    return 0;
    }

    得到还是12,16。

    也就是说继承来的父类那块内存完整保存,包括父类的虚指针。

    上面并没有尝试各种可能情况,也许你会有意外发现,可以一起分享,睡觉喽!

    生命在于折腾,生活就是如此的丰富多彩
  • 相关阅读:
    ubuntu12.04 安装配置jdk1.7
    Ubuntu下解决bash 没有那个文件或目录的方法
    Mongodb集群搭建的三种方式
    AngularJS 中文资料+工具+库+Demo 大搜集
    Android 反编译apk 详解
    Node.js 开发模式(设计模式)
    Comet:基于 HTTP 长连接的“服务器推”技术
    基于NodeJS的全栈式开发
    node.js应用Redis数据库
    Hibernate(二):MySQL server version for the right syntax to use near 'type=InnoDB' at line x
  • 原文地址:https://www.cnblogs.com/Mr-Zhong/p/4104639.html
Copyright © 2011-2022 走看看