当前位置: 首页 > article >正文

内联函数与动态内存分配

内联函数

调用普通函数的问题:

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

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

 

 总结

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;
}

 


http://www.kler.cn/news/283702.html

相关文章:

  • URP custompasscustom render objects
  • c++多线程交替输出
  • 启动盘如何复原
  • 【一文详解】内外网文件摆渡系统,解决网间数据安全传输问题
  • 【Python进阶(十二)】——自然语言处理
  • 《华为云 AI:开启智能未来的钥匙》
  • zsh 的补全系统
  • 数字芯片设计验证经验分享(第三部分):将ASIC IP核移植到FPGA上——如何确保性能与时序以完成充满挑战的任务!
  • 【FRP 内网穿透】
  • 【问题分析】SetupWizard退出动画卡住【Android15】
  • 【零知识证明】Groth16
  • GAMES202——作业3 Screen Space Ray Tracing
  • 创建型设计模式-构建器(builder)模式-python实现
  • 35. 交错动画 导航列表项的悬停和聚焦效果
  • Linux下UDP编程
  • InternVL 多模态模型部署微调实践
  • 物联网平台组件2: 平台校验规则
  • 如何构建社区康养养老系统:Java SpringBoot与Vue实战养老管理系统
  • uniapp的锁屏上文字的显示与隐藏
  • ES6中新增的Set方法详解
  • 小资人群“轻社交”需求与创新营销模式——以“2+1 链动模式小程序、AI 智能名片、S2B2C 商城系统”为例
  • 代码随想录Day 28|题目:122.买卖股票的最佳时机Ⅱ、55.跳跃游戏、45.跳跃游戏Ⅱ、1005.K次取反后最大化的数组和
  • 防抖函数 debounce debouncePromise
  • 获得两类相关点之间的线性关系
  • 简易STL实现 | List的实现
  • 【leetcode刷题记录】二叉树遍历
  • 易查分如何查询图片?
  • 梧桐数据库(WuTongDB):什么是“顺序扫描”
  • 1.3金融术语的宝典
  • PHP房产管理多终端系统灵活应对各种管理需求系统小程序源码