摘要:一. 区域划分堆: 是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。栈:是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是 thread safe的。每个C ++对象的数据成员也存在在栈中,每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换 SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。一个由C/C++编译的程序
阅读全文
摘要:在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐。 内存对齐的原因: 1)某些平台只能在特定的地址处访问特定类型的数据; 2)提高存取数据的速度。比如有的平台每次都是从偶地址处读取数据,对于一个int型的变量,若从偶地址单元处存放,则只需一个读取周期即可读取该变量;但是若从奇地址单元处存放,则需要2个读取周期读取该变量
阅读全文
摘要:int **p;p是一个指针变量,它指向一个指向整型数据的指针变量int (*p)(); p为指向函数的指针,该函数返回一个整型值int *p(); p为带回一个指针的函数,该指针指向整型数据int p(); f为带回整型函数值的函数int (*p)[n]; p为指向含n个元素的一维数组的指针变量int *p[n];定义指针数组p,它由n个指向整型数据的指针元素组成i n t a[n]; 定义整型数组a,它有n个元素int *p; p为指向整型数据的指针变量int i; 定义整型变量i
阅读全文
摘要:字符串指针与一维数组指针有很多共同点,但也有一些区别:1、赋值有要求。 我们可以在程序中将一个字符串赋给一个字符串指针变量,但不可以将一个字符串赋给一个数组名。即:允许:char *p; p = "I am a teacher !"; 但不可心: char a[20]; a = "I am a teacher!";这是因为字符串指针变量本身是一个变量,而字符串代表了其首地址,因而赋值是理所当然的;但数组就不一样,数组一旦定义后,数组在内存中的存储单元即确定,数组名所代表的数组首地址即确定,它便不可改变,因而不可将一个字符串赋给数组名。2、指针变量必须有明
阅读全文
摘要:struct 简单来说就是一些相互关联的元素的集合,说是集合,其实它们在内存中的存放是有先后顺序的,并且每个元素都有自己的内存空间。那么按照什么顺序存放的呢?其实就是按你声明的变量顺序来存放的,下面先看一个例子:struct sTest{int a; //sizeof(int) = 4char b; //sizeof(char) = 1shot c; //sizeof(shot) = 2}x;所以在内存中至少占用 4+1+2 = 7 byte。然而实际中占用的内存并不是7 byte,这就涉及到了字节对齐方式.union 的不同之处就在于,它所有的元素共享同一内存单元,且分配给 union 的内
阅读全文