C++数据成员的内存布局

#include   < iostream >
using   namespace   std;

class   Test
{
public:
    int   stra;
    static   int   sta;//静态数据成员并不会介入对象内存布局。
    int   strb;
    int   strc;
};
int   Test::sta   =   1;

int   main()
{
    int   a;
    int   b;
    int   c;
    Test   s;

    cout   < <   " 局部变量 "   <<   &a   << endl ;   //函数里的局部变量先入栈的在高地址。
    cout   <<   " 局部变量 "   <<   &b   << endl ;
    cout   <<   " 局部变量 "   <<   &c   << endl ;

    cout   << endl ;

    cout   <<   " 类中非静态数据成员 "   <<   &s.stra   << endl ;   //class struct 中的数据成员先声明的在低地址。
    cout   <<   " 类中静态数据成员 "   <<   &s.sta   << endl ;       //静态数据成员并不会介入对象内存布局。
    cout   <<   " 类中非静态数据成员 "   <<   &s.strb   << endl ;
    cout   <<   " 类中非静态数据成员 "   <<   &s.strc   << endl ;

      return   0;
}
 

局部变量0x22ff4c
局部变量0x22ff48
局部变量0x22ff44

类中非静态数据成员0x22ff38
类中静态数据成员0x402000
类中非静态数据成员0x22ff3c
类中非静态数据成员0x22ff40

 
 
 
 

C++ Standard 要求,在同㆒个 access section  (也就是 private、public、protected 等
区段),members 的排列只需符合「较晚出现的 members 在 class object ㆗有较高的地址」 这㆒条件即可,各个 members 并不㆒定得连续排列。

 

1、同一个访问权限中,较晚出现的数据成员具有较高的地址;

2、数据成员并不一定连续排列;

3、静态数据成员并不会介入对象内存布局。

4、“vptr一般出现在数据成员的最后,但是也有编译器将其放在数据成员的最前面。”

5、C++ 标准允许不同访问权限的数据成员自由排列,如下例

z在内存布局中可能出现在y的前面,“但是据我所知,目前没有任何编译器这么做”。

class Point3d {
public:
// ...
private:
float x;
static List<Point3d*> *freeList;
private:
float y;
static const int chunkSize = 250;
private:
float z;
};


 

转载于:https://www.cnblogs.com/helloweworld/p/3174044.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值