C++学习之路(一):const与define,结构体对齐,new/delete

前言:针对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;

原文地址:https://www.cnblogs.com/scu-cjx/p/8572601.html