内联和动态内存分配

内联和动态内存分配

内联

1.内联

•内联就是用函数已被编译好的二进制代码,替换对该函数的调用指令
–内联在保证函数特性的同时,避免了函数调用的开销
–内联通过牺牲代码空间,赢得了运行时间
正常函数调用
内联函数

2.隐式内联和显式内联

•内联通常被视为一种编译优化策略

•若函数在类或结构体的内部直接定义,则该函数被自动优化为内联函数,谓之隐式内联
–struct User { void who (void) { … } };

•若在函数定义前面,加上inline关键字,可以显式告诉编译器,该函数被希望优化为内联函数,这叫显式内联
–inline void foo (void) { … }

3.内联的适用条件

•内联会使可执行文件的体积和进程代码的内存变大,因此只有频繁调用的简单函数才适合内联

•稀少被调用的复杂函数,调用开销远小于执行开销,由内联而获得的时间性能的改善,不足以抵消空间性能的损失,故不适合内联

•inline关键字仅仅表示一种对函数实施内联优化的期望,但该函数是否真的会被处理为内联,还要由编译器的优化策略决定

•带有递归调用或动态绑定特性的函数,无法实施内联,编译器会忽略其声明部分的inline关键字

动态内存分配

1.new/delete操作符

•C++提供了new和delete操作符,分别用于动态内存的分配和释放
–int* p = new int; delete p;

•C++的new操作符允许在动态分配内存时对其做初始化
–int* p = new int;
–int* p = new int ();
–int* p = new int (100);

2.数组的分配与释放

•以数组方式new的也要以数组方式delete
–int* p = new int[4] {10, 20, 30, 40}; delete[] p;

•某些C++实现,用new操作符动态分配数组时,会在数组首元素前面多分配4或8个字节,用以存放数组的长度

•new操作符所返回的地址是数组首元素的地址,而非所分配内存的起始地址

•如果将new操作符返回的地址直接交给delete操作符,将导致无效指针(invalidate pointer)异常

•delete[]操作符会将交给它的地址向低地址方向偏移4或8个字节,避免了无效指针异常的发生

3.重析构

•不能通过delete操作符释放已释放过的内存
–int* p = new int; delete p; delete p; // 核心转储
–标准库检测到重析构(double free)异常后将进程杀死,并转储进程映像

•delete野指针后果未定义,delete空指针安全
–int* p = new int; delete p; p = NULL; delete p; // 什么也不做

4.内存分配失败

•内存分配失败,new操作符抛出bad_alloc异常

char* p = (char*)malloc (0xFFFFFFFF); 
if (p == NULL) 
{ 
    cerr << "内存分配失败!" << endl; 
    exit (-1); 
}

–try 
{ 
    char* p = new char[0xFFFFFFFF]; 
} 
catch (bad_alloc& ex) 
{ 
    cerr << "内存分配失败!" << endl; 
    exit (-1); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于您的第一个问题,我很乐意回答。 ①编写内联函数求解2x²+4x+5的值: 假设您想要编写一个内联函数来计算2x²+4x+5的值,您可以这样实现: ```c++ inline int calculate(int x) { return 2*x*x + 4*x + 5; } inline double calculate(double x) { return 2*x*x + 4*x + 5; } ``` 在这个函数中,我们使用了函数重载来实现接受int类型和double类型的输入参数。对于int类型,函数返回的是int类型的结果,对于double类型,函数返回的是double类型的结果。使用内联函数可以避免函数调用带来的开销,从而提高程序的运行效率。 ②动态内存分配动态内存分配是在程序运行时动态地分配内存空间的过程,可以使用new和delete操作符来实现。下面是一个简单的示例,演示了如何使用new操作符分配一个int类型的数组,并在程序结束时使用delete操作符释放分配的内存: ```c++ int* arr = new int[10]; // 分配一个包含10个int元素的数组 // 对数组进行一些操作 delete[] arr; // 释放分配的内存 ``` 当您使用new操作符分配内存时,它会返回一个指向新分配的内存空间的指针。当您使用delete操作符释放内存时,它会释放该指针指向的内存空间,并使该指针无效。使用delete操作符释放分配的内存是一种良好的编程实践,可以避免内存泄漏和程序崩溃的风险。 使用动态内存分配时,需要注意不要分配过多的内存,否则可能会导致程序崩溃或运行缓慢。此外,在分配内存时,还需要考虑内存对齐和内存碎片等问题,以确保程序的正确性和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值