zoukankan      html  css  js  c++  java
  • 论c++中对象的内存布局

    对象的内存布局就是计算对象所占用的内存大小,对象的大小只包含数据成员,类成员函数是执行代码,不属于对象的数据成员。在不讨论类的继承,以及虚函数的时候。一个对象的大小的计算公式一般为:

    对象的大小 = sizeof(数据成员1) + sizeof(数据成员2) + ... + sizeof(数据成员n)。

    但是,即便在这种情况下,仍然有3中特殊情况不满足这个公式:

    1 空类:

    空类中没有任何数据成员。按照公式计算,此类的对象所占用的内存空间应该为0.而实际情况是,空类的对象对象长度为1字节。如果类对象完全不占用内存空间,就无法取得实例化对象的地址,this指针失效。而类的定义有成员数据和成员函数组成,在没有成员数据的情况下,仍可以有成员函数,因此,就为空类分配了1字节的空间用来实例化类。这1字节并没有被使用。

    2 静态数据成员:

    静态的数据成员属于类,而不属于类的对象,因此,类对象的大小不包括静态数据成员。

    3 内存对齐:

    这种情况最为复杂。

    为什么需要内存对齐,请参考http://blog.csdn.net/lgouc/article/details/8235471

    对齐规则,请参考http://baike.baidu.com/view/4786260.htm

    需要补充的是,当类里面含有嵌套的类成员时,不会将类的整体长度参与到对齐计算中,而是以嵌套定义的结构体所使用的对齐值进行对齐。比如:

    #include <iostream>
    #pragma pack(8)
    using namespace std;
    class X  {
        char a;
        char b[4];
        short c;
    };
    
    class Y {
        int a;
        X b;
    };
    
    int main() {
        cout << sizeof(X) << endl;
        cout << sizeof(Y) << endl;
      
        
        
    }
        

    按照对齐规则,类X的大小为8,但是在计算类Y的大小时,并不是按类X的大小8参与到对齐计算中。由于类X的整体对齐系数 = min(max(char, char, short), 8) = 2, 所以,应该用类X的整体对齐值2来参与类Y的对齐计算,这样算出来为类Y大小为12

  • 相关阅读:
    文件IO流
    ArrayList LinkedList vector的区别
    双例集合Map,HashMap常用方法及源码分析
    单例集合List和Set
    集合与数组
    自然排序与定制排序
    String StringBuffer StringBuilder
    String与其他结构的转化
    线程的通信
    死锁,同步锁
  • 原文地址:https://www.cnblogs.com/chaoguo1234/p/3074534.html
Copyright © 2011-2022 走看看