C++对象中数据成员的布局

首先,对于类中定义的变量,各个编译器内部并没有强制规定成员布局的情况。

只有一些简单的标准:

1    在同一个访问控制标号(public,private,protected)中定义的非static变量在对象的内存布局顺序是按照定义的顺序

2    不同的访问控制标号下的(非static)成员变量并无先后顺序的要求。

3    编译器可能还会合成一些内部使用的数据成员,比如虚函数表的指针vptr;C++标准并没有规定那些内部产生的指针的位置

在内存中的位置,甚至可以放在其他成员变量之间。

比如如下的类定义:

class Point3d

{

private : int x;

private: int y;

private : int z;

};

在内存布局上x、y、z的布局并没有限制。

class Point3d

{

privtate:

int x,y,z;

};

//在内存布局中x、y、z是按定义顺序一次排列的。

对于上述的编译器内部产生的数据,如vptr,虽然并没有要求其具体存放位置,但是一般的编译器会将其放在对象内存的最开头或者是最后。

如下面的代码(下面的代码可以看出vptr被安放在最开头的位置)。

#include <iostream>

#include <cstdio>

using namespace std;

class Point3d

{

public:

virtual ~Point3d(){}

public:

static Point3d origin;

float x,y,z;

};

int main()

{

cout << sizeof(Point3d) << endl;

printf("&Point3d::x : %p\n" ,&Point3d::x);

printf("&Point3d::y : %p\n" ,&Point3d::y);

printf("&Point3d::z : %p\n" ,&Point3d::z);

}

由于析构函数为虚函数,导致在该类的任何对象中都会生成一个vprt指针,结果显示:

结果显示的是在对象内存布局中的成员变量的偏移量,依次为4,8,12,也就是说第一个位置是vptr;偏移量为0。这也正好验证了类

的大小为16。

参考书籍:深度探索C++对象模型

C++对象中数据成员的布局

时间: 2024-12-28 15:46:06

C++对象中数据成员的布局的相关文章

项目二:对象作为数据成员

[项目2 - 对象作为数据成员] 回想Engineer类的数据成员,有眼镜.背包等.某Engineer的眼镜.背包,是Glass.Bag类的对象.类中的数据成员,其类型可以是简单类型,也可以是类.通过这种方式,将某些类组合到另外的类中,当作其中的一个"部件"使用. 本项目设计一个三角形类,其数据成员不再是三角形三条边的边长,而是三角形的三个顶点.利用设计的三角形类,输入三角形的三个顶点,求出其面积.周长,并判断其是否为直角三角形和等腰三角形. 提示:(1)这个问题需要用到两个类,顶点类

OpenCV访问Mat对象中数据时发生异常---Mat中的数据访问

7.1和7.1.1由于越狱不成熟,半完美越狱后电脑上无法访问系统越狱目录,如var usr 等等. 今天有些意外地发现,可以在电脑上使用手机的越狱目录我手机 i4 7.1.1 联通 半完美越狱,没装Afc2Add,也没装Appsync 附上  --->我的半完美越狱过程 好了,下面直接正题 一.前提,必须安装ifile! 打开ifile,并转到 /var/mobile/media 目录下,然后点击右上角的 [ 编辑 ]如图: 二.点左下角的 + 号创建,如图: 三.点 [ 类型],选择[符号链接

第五周 项目二-对象作为数据成员

问题 回想Engineer类的数据成员,有眼镜.背包等.某Engineer的眼镜.背包,是Glass.Bag类的对象.类中的数据成员,其类型可以是简单类型,也可以是类.通过这种方式,将某些类组合到另外的类中,当作其中的一个"部件"使用. 本项目设计一个三角形类,其数据成员不再是三角形三条边的边长,而是三角形的三个顶点.利用设计的三角形类,输入三角形的三个顶点,求出其面积.周长,并判断其是否为直角三角形和等腰三角形. 提示:(1)这个问题需要用到两个类,顶点类参照项目1中的CPoint类

C++中默认构造函数中数据成员的初始化

构造函数的任务是初始化数据成员的,在类中,如果没有显示定义任何构造函数,编译器将为我们创建一个构造函数,称为合成的默认构造函数,合成的默认构造函数使用与变量初始化相同的规则来初始化成员.即当类中的数据成员没有在构造函数中显示初始化,将执行默认初始化: 1.对于内置类型(如int,double,char,bool等)和复合类型(数组,指针),定义任何函数体之外的内置类型或复合类型变量将被初始化0,对于函数体内的内置类型的对象,若没有初始化,其值是未定义的. 2.具有类类型的成员通过运行各自的默认构

1.类中数据成员的声明与初始化总结

在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样 class A   { private: static int count ; // 类内声明 }; int A::count = 0 ; // 类外初始化,不必再加static关键字 为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的. 什么东西能在类内初始化 能在类中初始化的成员只有一种,那就是静态常量成员. 这样不行 class A  

第十六周oj刷题——Problem C: B 求类中数据成员的最大值-类模板

Description 声明一个类模板,类模板中有三个相同类型的数据成员,有一函数来获取这三个数据成员的最大值. Input 分别输入3个整数,3个浮点数,3个字符 Output 3个整数的最大值 3个浮点数中的最大值 3个字符中的最大值 Sample Input 9 5 6 1.1 3.4 0.9 a b c Sample Output 9 3.40 c /* All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2015年 6 月 25 日

统计对象中某个成员变量的访问次数

实例1:适用于非const对象 #include <iostream> #include <string> using namespace std; class Test { private: int m_value; int m_count; public: Test(int value = 0) { m_value = value; m_count = 0; } int getValue() { m_count++; return m_value; } void setValu

对象作数据成员

输入代码: /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:sum123.cpp * 作 者:林海云 * 完成日期:2015年4月7日 * 版 本 号:v2.0 * * 问题描述:本项目设计一个三角形类,其数据成员不再是三角形三条边的边长,而是三角形的三个顶点. 利用设计的三角形类,输入三角形的三个顶点,求出其面积,周长,并判断其是否为直角三角形和等腰三角形. * 输入描述:输入三角形的三个顶点 * 程序输出:输出

使用指向对象的空指针访问对象中的成员函数

class AES  {      public:          AES(){m_data=2;}          virtual void fun1(){cout<<"fun1"<<endl;}          void fun2(){cout<<"fun2"<<endl;}          void fun3(){cout<<m_data<<endl;}      private: