内联函数与动态内存分配

内联函数

调用普通函数的问题:

          每个普通函数调用语句都需要发生跳转操作,这种跳转操作会带来时间开销

联就是用 函数已被编译好的二进制代码 替换 对该函数的调用指令
联在保证函数特性的同时,避免了函数 调用的时间开销

 总结

1.内联会使可执行文件的体积和进程代码的内存变大,因此只有频繁调用的简单函数才适合内联
2.inline关键字仅表示期望该函数被优化为内联,但是否适合内联则完全由编译器决定
3.稀少被调用的复杂函数和递归函数都不适合内联

 代码演示

//内联函数:编译器的优化策略
#include<iostream>
void foo(int x){    //普通函数
    cout << "foo(int):" << x << endl;
}
inline void bar(int x){ //内联函数
    cout << "bar(int):" << x << endl;
}
using namespace std;
int main(){
    foo(10);  //生成跳转指令,调用函数
    foo(20);  //..........
    foo(30);  //..........

    bar(10);  //将此处替换为bar函数编译后产生的二进制指令集,不生成跳转指令
    bar(20);  //..........
    bar(30);  //.........
    return 0;
}

动态内存分配

可以继续使用 标准 C 库函数 malloc /free
更建议使用 new / delete 操作符在堆中分配 / 释放内存
–> int * pi = new int ;
->delete pi;
在分配内存的同时 初始化
–> i nt * pi = new int (100);
以数组方式 new 的也要以 数组方式 delete
–> int * pi = new int [4] {10, 20, 30, 40};
->delete[ ] pi;
        当你申请这4个int类型大小的空间时,系统默认会多分配一个int类型大小,用来计数,存储当前数组元素个数。对于这4个字节的数据,系统拒绝用户对这块数据进行任何操作,用户可以获取这块空间的地址,但不能进行读写。在释放这个数组的空间时,指针会先进行减4字节的操作,从而连同多分配的这4字节数据一 起释放。                                                                                                                      
1.      通过new操作符分配N维数组,返回N-1维数组指针
                int (*prow)[4]= new int [3][4];
                int (*pparr)[4][5]= new int [3][4][5]
2.      不能通过delete操作符释放已释放过的内存
3.      delete野指针后果未定义,delete空指针安全
4.      new操作符申请内存失败,将抛出异常

代码演示 

//动态(堆)内存分配
#include <iostream>
#include<cstdlib>
using namespace std;
int main(){
    int* pm = (int*)malloc(4);
    cout << "*pm:" << *pm << endl;
    free(pm);

    int* pn = new int(100);//堆内存初始化为100
    cout << "*pn:" << *pn << endl;
    delete pn;

    int* parr = new int[4]{1,2,3,4};
    for(int i = 0; i < 4; i++){
        cout << parr[i] << ' ' ;
    }
    cout << endl;
    delete[] parr;
    int(*p)[4] = new int[3][4]; //动态分配二维数组
    delete[] p;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值