前言:针对C++ Primer和Effective C++两本书,以及技术博客与实验测试,本系列主要是针对C++进行系统化学习,记录学习中遇到的问题和经验。
(一)const与define
关于const与define的用法与比较,可以详见我之前的这篇文章,在这里就不再赘述了。
(二)结构体对齐
简单说一下为什么需要结构体对齐,或者说内存对齐。
在32位操作系统中,一次寻址能够取得的指令长度是4字节(也就是32位地址)。对于一个4字节变量来说,如果其存放的位置在正好在一个4字节中,那
对于操作系统而言,只需要一次访存就可以获得。如果其分存在两个4字节地址,则系统需要先进行一次访存取得前一块内存中的数据,再进行一次访存取得
后一块内存中的数据。显然这样带来的问题,即影响了程序运行的性能。
总结一下:
什么是内存对齐:
1)编译器为每个数据单元排在合适的内存地址上
为什么需要内存对齐:
1)提高性能
如何对齐:
1)第一个数据成员放在内存偏移量为0的地址;
2)接下来的数据成员放在4字节整数倍的地址;
3)如果是结构体,结构体整体也会进行内存对齐
给两个例子:
struct test1 { char a; int b; char c; } struct test2 { char a; char b; int c; } cout<<sizeof(test1)<<endl; cout<<sizeof(test2)<<endl;
其中sizeof(test1)的结果为12,sizeof(test2)的结果为8,简单分析一下:对于test1来说,a占一个字节,接下来的b占4个字节,为了保证内存对齐,b需要一个完整的4字节大小内存,
一个示意图为(1表示占用,0表示未占用)
a: 1 0 0 0
b: 1 1 1 1
c: 1 0 0 0
整个结构体大小为12个字节。
再看test2,a占一个字节,b占一个字节,c占4个字节,在这种情况下,内存分配的示意图为
a,b : 1 1 0 0
c: 1 1 1 1
整个结构体大小为8个字节
总结一下:在结构体变量声明中,为减少内存开销,应该尽可能的将内存小的变量先定义,内存大的变量后定义。
(三)new和delete
(1)new/delete 与 malloc/free
new和delete是c++中的运算符,malloc和free是c中的库函数。它们的本质比较类似,从进程地址空间的堆区分配一块内存,返回内存首地址,但new和delete可以用于分配类对象的地址
空间,这个对于malloc和free来说不行。
(2)new 与 new [5]
int *p = new int(5); //分配一个int对象,数据为5
int *q = new int[5]; //分配5个int对象
(3)delete 与 delete []
delete主要针对一个对象,将其内存进行释放。
delete []主要针对对象数组,将其数组内存进行释放。
注意:上述(2)中q,如果采用delete q,仅仅只会释放q[0]所在的内存区域,从而造成内存泄露,正确的方式应该采用delete []q;