转:c++类实例在内存中的分配
转自:http://blog.csdn.net/alexwei2009/article/details/6157926
c++是一种面向对象的编程语言,它向下保持了对c的兼容,同时也允许程序员能够自由的操控内存,虽然会带来一些问题,但这不是我们要探讨的问题,略过不表。类是对某种对象的定义,包含变量和方法,也可以理解为现实生活中一类具有共同特征的事务的抽象,他是面向对象语言的基础。所以类是不占有内存的,可是如果类生成实例那么将会在内存中分配一块内存来存储这个类。
类的实例在内存中是如何分配内存的,有什么需要我们注意的,下面将慢慢到来。
比如下面一个类:
class A
{};
从形式上看,它似乎什么有没有,事实上它不止隐含了一个构造函数和一个析构函数,还有一些操作符重载函数,比如“=”。如果类A被实例话,如A a;在内存会占据多大的空间呢?有人可能会说4,也有人会说0,还有人会说1,说1的就对了,为什么会是1呢?原因有很多,如果我们定义一个数组A b[10];如果上面是0,这样的局面将会很尴尬,所以A这样一个空类,编译器会给它一个字节来填充。
增加一个变量,(字节对齐默认都是4)
class A
{
public:
int i;
}
类A的实例将占据4个字节的内存,sizeof(A) = 4
变量i 的初值被编译器指定位0xcdcdcdcd。
再增加一个变量,
class A
{
public:
int i;
int l;
}
此时按照变量生命的先后顺序,i被放在低地址上,l紧随其后。
实例占用8个字节,sizeof(A) = 4*2 = 8
如果累里面含有函数:
class A
{
public:
int i;
int l;
int add(int x,int y){return (x+y);}
};
有些人可能会说类的大小是12,事实上sizeof(A) = 8;
为什么会这样,这是因为sizeof访问的程序的数据段,而函数地址则被保存在代码段内,所以最后的结果是8.
再看下面这个情况
class A
{
public:
int i;
int l;
static int s;
int add(int x,int y){return (x+y)};
};
此时sizeof(A)大小仍为8,这里留给读者去思考为什么?(^-^)。
当类里面含有虚函数时,情况会如何呢?
class A
{
public:
int i;
int l;
static int s;
virtual void Say(){};
int add(int x,int y){return (x+y)};
};
因为含有虚函数,所以类里面将含有一个虚指针vptr,指向该类的虚表vtbl,一个指针占用四字节的地址,所以sizeof(A) = 12
虚指针放在类实例地址的最低位置,
比如 A *a = new A;
我们可以这样给变量i赋值
int *p = (int *)a;
p++;
*p = 1;//把i的值赋为1.
如果类作为派生类,内存将如何分配呢?
这种情况虽然有些复杂,但并不是说不好理解。
他有多少个父类每个父类的大小加起来在加上自身就是sizeof的大小。
转:c++类实例在内存中的分配的更多相关文章
- JVM存储位置分配——java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配
Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”. 根据“Java ...
- Java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配
转自:https://blog.csdn.net/leunging/article/details/80599282 感谢CSDN博主「leunging」的总结分享 ———————————————— ...
- java对象在内存中的分配
java对象在内存中的分配 http://blog.csdn.net/qq_30753945/article/details/54974899
- C++类成员在内存中的存储及对齐方式
前言:数据对齐的基本理论参见文章:http://www.cnblogs.com/MyBlog-Richard/articles/5993448.html 一.空类的大小 C++中空类的大小是1,这是因 ...
- PHP面向对象(PHP对象在内存中的分配)
对 像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻 辑上 说大体上是分为4 段,栈空间段. ...
- PHP对象在内存中的分配
对像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻辑上 说大体上是分为4 段,栈空间段.堆空 ...
- 【转】PHP对象在内存中的分配
对像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻辑上 说大体上是分为4 段,栈空间段.堆空 ...
- PHP对象在内存中的分配(转载)
http://www.cnblogs.com/hongfei/archive/2012/06/12/2547120.html 对像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据 ...
- java中成员变量和局部变量在内存中的分配
对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量:局部变量就是方法或语句块内部定义的变量.局部变量必须初始化. 形式参数是局部变量,局部变量中基础数据类型的引用和值都存储在栈中,对象引 ...
随机推荐
- 安装zeromq以及zeromq的python示例
下载ZeroMq: wget https://github.com/zeromq/zeromq4-1/releases/download/v4.1.5/zeromq-4.1.5.tar.gz 解压: ...
- 2016年11月9日 星期三 --出埃及记 Exodus 19:25
2016年11月9日 星期三 --出埃及记 Exodus 19:25 So Moses went down to the people and told them.于是摩西下到百姓那里告诉他们.
- php 日期时间操作-可算出几天后的时间
本文为大家介绍一下根据PHP时间戳获取当前时期的具体方式.strtotime能将任何英文文本的日期时间描述解析为Unix时间戳,我们结合mktime()或date()格式化日期时间获取指定的时间戳,实 ...
- Scala循环操作
val buf = new scala.collection.mutable.ArrayBuffer[Int] for (i <- 0 to 10) { buf += i } buf += 11 ...
- podupdate时没有进度
pod无法下载,解决方法. pod install --verbose --no-repo-update 原有命令被墙了. pod install --verbose --no-repo-update ...
- Objective-C学习笔记_Xcode模拟命令行填入参数执行
菜单Product->Edit Scheme 左边找到run xxx,点击后再邮编选择Arguments面板中就可以设置Xcode在运行命令行app时模拟输入参数. 设置完成后再次run就会自动 ...
- fragment (1)简单示例:定义,界面配置,fragment之间的跳转
fragment作用 同一程序中切换界面 比activity轻快,灵活. fragment代码示例 ide : android studio 1.2 sdk : 22 package com.exa ...
- 进程间通信之打开关闭一个exe文件
一.打开 1.WinExec("F:\\QQ\\Bin\\QQ.exe",SW_SHOW); 注意:'\'需要改成'\\',阻塞 2. STARTUPINFO si; PROCES ...
- duilib\utils\utils.h(251) : error C2504: “VARIANT”: 未定义基类
转载:http://blog.csdn.net/SP_daiyq/article/details/44542939?locationNum=3 创建win32应用程序的工程文件,删除不需要的代码,只留 ...
- 使用FindFirstFile,FindNextFile遍历一个文件夹
//遍历文件夹函数 void TraverseFolder(LPCTSTR lpPath) { TCHAR szFind[MAX_PATH] = {_T("\0")}; WIN32 ...