内存的一点读书笔记

 

数据在内存中存放方式有big-endianlittle-endian两种方式。

 

假设数据:0xABCDEF12

big-endian方式存放为:AB CD EF 12

little-endian方式存放为:12 EF CD AB

 

下面以一个测试程序为例:

#include <stdio.h>

 

void main(int argc, char **argv)

{

       unsigned long value = 0xABCDEF12;

       unsigned char *arr;

       arr = (unsigned char *)&value;

      

       //数据顺序

       printf("0x%x 0x%x 0x%x 0x%x/n", arr[0], arr[1], arr[2], arr[3]);

       //地址顺序

       printf("0x%x 0x%x 0x%x 0x%x/n", &arr[0], &arr[1], &arr[2], &arr[3]);

       //头指针顺序

       printf("0x%x/n", arr);

      

       return;

}

我的电脑是联想的,用的是Intel(R) Pentium(R) D CPU 3.00GHzCPU。所以输出结果是:

0x12 0xef 0xcd 0xab

0x12ff5c 0x12ff5d 0x12ff5e 0x12ff5f

0x12ff5c

12

AB

 

CD

 

EF

 

0x12ff5f &arr[3]

0x12ff5e &arr[2]

0x12ff5d &arr[1]

0x12ff5c &arr[0]


由于CPU的不同而导致存储数据的方式不同,在网络中的每台主机的CPU可能以不同的方式来保存数据,为了保证数据传输前后的含义相同就规定了big-endian为“网络传输顺序”。(假设在通讯中的协议由你自己编写,你就可以规定默认的字节顺序是big-endian还是little-endian)。

在我们公司的下位机程序中堆栈增长方式是向下增长,内存存储方式是little-endian。这样做的话,在调试程序时little-endian的数据看起来比较顺眼。

 

操作系统用了两种方法来管理内存:内存分段和内存分页。

内存分段:内存不分段(MS DOS)程序可以控制整个内存。内存分段提供了一种保护措施。给每个进程(任务)分配一段固定的区域,本进程(任务)申请内存不会超出这个区域,这样的话,即使本进程(任务)执行错误也不会影响其他的进程(任务)执行。操作系统的内存管理机制会自动地管理进程内存空间,而做下位机程序的话,每个任务的空间要自己设定,并保证足够,否则会跑到别的任务中去,影响比较恶劣。

内存分页:32位机可允许的内存寻址是4GB,计算机物理内存一般没有这么大(现在电脑内存很大了,一般都是1GB2GB甚至更大)。物理内存访问速度很快但是空间有限,磁盘空间访问速度很慢但是空间很大,为了扩大内存就要用一部分磁盘空间来充当内存,用软件的方法来使这部分磁盘空间变为虚拟内存,这样内存就扩大了。这叫用软件来实现硬件效果,用时间来换取空间。分页就是将内存空间(包括当作内存的磁盘空间)划分成固定大小的块(叫内存页),然后当物理内存不够时,有的数据就会交换到作为内存空间的磁盘部分,操作系统都有不同的策略来实现这个交换。

 

应用程序的内存可划分为好多段,在写汇编程序时体会比较深刻。比如数据段,堆栈段,数据堆和正文段等。有一个宗旨就是:任何一个程序都分为数据和指令两个部分,各种各样的内存管理技术的区别就是用不同的方法来划分和组织各种程序中的指令和数据。正文段存储的是存放程序指令的。有一种情况,程序中只有一个内存段,这时数据和指令放在一起(都在正文段)。数据段时存放全局变量的。它们是在编译时由编译器取定的,是静态空间一般不会伸缩。堆栈就是保存临时数据的,在任务切换时或者调用一个函数时,压栈出栈一些上下文数据。数据堆就是allocfreenewdelete操作的对象。

数据堆的空间申请和释放有两种方式,一种是自动释放,一个是手动释放。自动释放的程序编译器在编译时需要加入自动管理的程序,所以程序稍微大一点。但是手动释放需要软件开发人员要知道什么时候该释放,什么时候不该释放,还不能忘记释放,忘记释放就是内存泄露,程序可能崩溃。还有的编程直接开了一些野指针(悬空指针)就拿来用,这也可能导致程序崩溃。(在我们公司提供的C编程平台中,好多客户就直接用野指针,这就是不理解内存结构的表现)C/C++需要明确的释放mallocnew申请的空间,而javaC#等就不用,因为它们有“垃圾回收机制”。这个垃圾回收机制就是管理数据堆释放的方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值