设为首页 加入收藏

TOP

谈VC++对象模型(二)
2012-11-02 08:51:57 】 浏览:25181
Tags:对象 模型

    2 类布局
   
    本节讨论不同的继承方式造成的不同内存布局。
   
    2.1 C结构(struct)
   
    由于C++(www.cppentry.com)基于C,所以C++(www.cppentry.com)也"基本上"兼容C.特别地,C++(www.cppentry.com)规范在"结构"上使用了和C相同的,简单的内存布局原则:成员变量按其被声明的顺序排列,按具体实现所规定的对齐原则在内存地址上对齐。所有的C/C++(www.cppentry.com)厂商都保证他们的C/C++(www.cppentry.com)编译器对于有效的C结构采用完全相同的布局。这里,A是一个简单的C结构,其成员布局和对齐方式都一目了然。
   
    struct A {
   
    char c;
   
    int i;
   
    };
   
    译者注:从上图可见,A在内存中占有8个字节,按照声明成员的顺序,前4个字节包含一个字符(实际占用1个字节,3个字节空着,补对齐),后4个字节包含一个整数。A的指针就指向字符开始字节处。
   
    2.2 有C++(www.cppentry.com)特征的C结构
   
    当然了,C++(www.cppentry.com)不是复杂的C,C++(www.cppentry.com)本质上是面向对象的语言:包含继承、封装,以及多态。原始的C结构经过改造,成了面向对象世界的基石--类。除了成员变量外,C++(www.cppentry.com)类还可以封装成员函数和其他东西。然而,有趣的是,除非为了实现虚函数和虚继承引入的隐藏成员变量外,C++(www.cppentry.com)类实例的大小完全取决于一个类及其基类的成员变量!成员函数基本上不影响类实例的大小。
   
    这里提供的B是一个C结构,然而,该结构有一些C++(www.cppentry.com)特征:控制成员可见性的"public/protected/private"关键字、成员函数、静态成员,以及嵌套的类型声明。虽然看着琳琅满目,实际上只有成员变量才占用类实例的空间。要注意的是,C++(www.cppentry.com)标准委员会不限制由"public/protected/private"关键字分开的各段在实现时的先后顺序,因此,不同的编译器实现的内存布局可能并不相同。(在VC++(www.cppentry.com)中,成员变量总是按照声明时的顺序排列)。
   
    struct B {
   
    public:
   
    int bm1;
   
    protected:
   
    int bm2;
   
    private:
   
    int bm3;
   
    static int bsm;
   
    void bf();
   
    static void bsf();
   
    typedef void* bpv;
   
    struct N { };
   
    };
   
    译者注:B中,为何static int bsm不占用内存空间?因为它是静态成员,该数据存放在程序的数据段中,不在类实例中。
   

                  

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 2/47/47
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇用VC++制作DLL经验 下一篇VC++数据类型

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目