关于C++ 类在内存中的存储问题

参考网站:

1.http://blog.csdn.net/fuzhongmin05/article/details/59112081

2.http://www.cnblogs.com/jerry19880126/p/3616999.html

网站1 把C++内存分为四个区:全局数据区、代码区、栈区、堆区。

全局变量、静态变量、常量放在全局数据区,成员函数和非成员函数放在代码区,函数参数、局部变量、返回值放在栈区,剩下的就放在堆区。

其中内容里面有段代码运行不通过,代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 class D
 4 {
 5 public:
 6     void printA()
 7     {
 8         cout << "printA" << endl;
 9     }
10     virtual void printB()
11     {
12         cout << "printB" << endl;
13     }
14 };
15 int main(void)
16 {
17     D *d = NULL;
18     d->printA();
19     d->printB();
20     return 0;
21 }

网站1没有说明为什么程序崩溃。

参考网站2说明了原因,当类有虚函数时,类中就会有隐藏的虚指针和虚表。虚指针是在构造函数创建的。

上面是我的理解,有错误的地方希望大家指正。

时间: 2024-12-09 11:33:42

关于C++ 类在内存中的存储问题的相关文章

QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度复制)非常实用

FROM:http://apps.hi.baidu.com/share/detail/33517814 今天做项目时,需要用到QList来存储一组点.为此,我对QList类的说明进行了如下翻译. QList是一种表示链表的模板类.QList<T>是Qt的一种泛型容器类.它以链表方式存储一组值,并能对这组数据进行快速索引,还提供了快速插入和删除等操作.QList.QLinkedList和QVector提供的操作极其相似:* 对大多数操作来说,我们用QList就可以了.其API是基于索引(inde

float 在内存中如何存储的

float类型数字在计算机中用4个字节存储.遵循IEEE-754格式标准:    一个浮点数有2部分组成:底数m和指数e 底数部分 使用二进制数来表示此浮点数的实际值指数部分 占用8bit的二进制数,可表示数值范围为0-255 但是指数可正可负,所以,IEEE规定,此处算出的次方必须减去127才是真正的指数.    所以,float类型的指数可从-126到128 底数部分实际是占用24bit的一个值,但是最高位始终为1,所以,最高位省去不存储,在存储中占23bit    科学计数法. 格式:SE

浮点数在内存中的存储(简述)

数据类型: 1.基本类型(整形,浮点型,字符型) 2.构造类型(数组,结构体,联合,枚举) 3.指针类型 查看数据范围:整形范围(limits.h) 浮点型类型(flaot.h) eg:有符号的char的表示范围:0000 0000~1111 1111(-128~127)其中最高位表示符号位,0为正 1为负 其实数据的存储和访问就下像作图这个圈一样,当你给它的127+1它就会变成128 整形变量: 一般来说字长为32的情况下,整形表示32位,短整形16位,长整形32位 数据在计算机中以补码的形式

移码及浮点数在内存中的存储方式

首先说一下十进制的小数怎么转化为二进制的小数,计算机根本就不认识10进制的数据,他只认识0和1,所以,10进制的小数在计算机中是用二进制的小数表示的. 十进制的小数转化为二进制的小数的方法: 可以简单的概括为正序取整,将十进制的小数部分乘以2,然后取整数部分. 例如将0.2转化为二进制的小数,那么0.2*2=0.4,其整数部分是0,所以二进制小数的第一位为0,然后0.4*2=0.8,其整数部分是0,所以二进制小数的第二位为0,然后0.8*2=1.6,其整数部分是1,所以二进制小数的第三位是1,然

一个 -100.01 的double 在内存中怎么存储的. 一个中文String 在内存中占多少直接 utf-8 / GBK

一.-100.01 的double 在内存中怎么存储的 double双精度数据类型存储格式IEEE 双精度格式为8字节64位,由三个字段组成:52 位小数 f : 11 位偏置指数 e :以及 1 位符号 s.这些字段连续存储在两个 32 位字中 二.一个中文String 在内存中占多少直接 utf-8 / GBK [腾讯实习生问到这个问题,当时还天真的回答unicode字符集和16位,哎...] GBK:1个ASCII码占1个字节,而1个汉字编码占2个字节. UTF:ASCII对应的字符在UT

结构体在内存中的存储方式

结构体在内存中如何存储? 遵循结构体对齐规则: 1.首先要知道默认对齐数:VS 中 8   Linux 中4 2.第一个成员放到0偏移处 3.后面所有的成员都放到对齐数(本身和默认对齐数的较小值)的倍数处偏移 4.结构体总大小为所有对齐数中最大对齐数的倍数 Eg: 运行结果为 24 图中可以看出内存有浪费,而我们将小的成员放一起可以节省资源 减少浪费. 上例可以改为: int i: char c: double d: 这样总大小只需16 节省浪费. 空的结构体类型大小为1,创建对象需要开辟空间,

C语言中浮点数在内存中的存储方式

关于多字节数据类型在内存中的存储问题 //////////////////////////////////////////////////////////////// int ,short 各自是4.2字节.他们在内存中的存储方式以下举个样例说明. int data = 0xf4f3f2f1; 当中低位存放在编址小的内存单元.高位存放在编址高的内存单元 例如以下: 地址:0x8000      0x8001    0x8002   0x8003 数据:   f1              f2 

字符串在内存中的存储——C语言进阶

字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常存储在数组或者从堆上分配的内存中.不过,并非所有的字符数组都是字符串,字符数组可能没有NUL字符.字符数组也用来表示布尔值等小的整数单元,以节省内存空间. C中有两种类型的字符串: 单字节字符串 由char数据类型组成的序列 宽字符串 由wchar_t数据类型组成的序列 wchar_t数据类型用来表示宽字符,要么是16位宽,要么是32位宽.这两种字符串都以NUL结尾.可以在string.h中找到单字节字符串函

变量在内存中的存储方式-----“大端”和“小端”

"大端"和"小端"可以追溯到1726年的Jonathan Swift的<格列佛游记>,其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端还是先打破较小的一端而争执不休,甚至爆发了战争.1981年10月,Danny Cohen的文章<论圣战以及对和平的祈祷>(On holy wars and a plea for peace)将这一对词语引入了计算机界(<程序设计实践>第9章).这么看来,所谓大端和小端,也就是big-endia