#C++高手学园# 内存的故事

内存的故事,是每一个C++选手都不得不去认真了解的故事。即使你不曾刻意去了解过它,它也时时刻刻存在于你的代码里。

1. 内存是什么

内存是一块线性增长的区域,可以认为地址从0x00000000 - 0xFFFFFFFF的4G个连续的单元,每个单元是1个字节(Byte)。把内存单元的位置称为地址,在C++以指针表示。

2. 变量和内存的关系

变量是放在内存上的,不同类型的变量占用的内存大小是不一样的。例如,char型变量占1 Byte,int型变量占 4 Byte。例如:
         unsigned int    b = 0x12345678;

这句话定义一个变量,其内容是4个字节: 12  34  56  78 (以下均以16进制表示) (暂不考虑大小端)


在VC里输入上述代码,在用“内存”窗口查看变量b处的内存: (输入&b) ,可以看到&b对应的地址,以及该处的内存的内容:78 56 34 12 。这是在Intel的系统上的显示,由于是小端系统,所以这种排列。


在C++里,用sizeof( )操作符可以量得变量所占内存的大小。int  nSize = sizeof(b); 则nSize的值为4

所以综上所述,变量有以下特性:

(1) 变量的值: 指的是内存中的字节的内容
(2) 变量的地址:指变量坐落在内存中的位置
(3) 变量的大小:指变量所占的内存空间的大小(以Byte计)

3.指针变量

指针变量可以简单地认为是一个32位整数,与unsigned int等同。指针变量的值是一个32位整数。举例说明:

unsigned int b = 0x12345678;
unsigned int* ptr = &b;

则ptr称为是指针变量,作为一个变量,考虑其3个特性:

(1) 变量的值: 12 34 56 78 (大端) 或 78 56 34 12 (小端)
(2) 变量的地址:  作为一个变量,它具有自己的地址
(3) 变量的大小: 4 Byte

4. 数组变量

数组占据一系列连续的内存单元。
unsigned int  array_1[20];
在内存排列上是20个连续的unsigned int,因为共占据20 * 4个单元。

5. 字节填充(Padding)与字节对齐(Alignment)

这是在使用struct类型时要考虑的问题。考虑以下结构定义:

struct  Sample
{
       int  a;
       char b;
       int c;
};

按照前面所讲的结论,sizeof(char) = 1, sizeof(int) = 4,那sizeof(Sample) = 4 + 1 + 4 = 9?  但是你在vc或linux下试一下,一般情况下你得到的结果应该是 sizeof(Sample) = 12 ,这是为什么呢?--这本质是字节对齐的要求。

举个例子,int类型的变量,其起始地址必须为4对齐的,否则无法操作。(在汇编语言中,按32整数来存取一块内存时,要求给一个4字节对齐的地址,否则在硬件电路上无法完成操作)。

例如:00000008是一个4对齐的地址,而00000007就不是。

虽然内存是以Byte为单位的,但是对于32位数据总线的系统来说,每次可以取4个字节。那么在取数据指令中,必须指定一个4字节对齐的首地址,这是硬件的要求。在上例中,假设a的地址是4对齐的,如果不在b后面填充3个字节,那c的首字地址就必然不是4对齐的。所以,编译器在安排这个数据结构时,在b和c之间填充了3个字节,以便保证c在4对齐的位置。

6. 大小端

大小端在另一篇文件里写过了,有空再抄过来哈。

7. 堆Heap与栈Stack

阅读量过300后再续。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿发你好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值