zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    函数 out 传值 分割
    函数
    特殊集合
    集合
    数组

    穷举
    循环
    mac 软件安装
    实用信息查询接口
  • 原文地址:https://www.cnblogs.com/scu-cjx/p/8572601.html
Copyright © 2011-2022 走看看