记录-编译器优化、valgrind内存泄漏检测工具

一.使用场景

        在Linux系统上,编写C语言程序时(实时串口通信的数据处理与转发程序),存在几个问题:

1.程序要求算法的耗时时间要低于接收数据的间隔时间,避免出现缓冲区溢出的问题。

2.程序移植后本身存在内存泄漏的问题,且程序代码量较大,需要排查该问题并解决。

二.编译器优化-GCC的优化工具 

1.工具介绍

        编译器优化指编译器在将源代码转换为可执行代码的过程中,对代码进行的一系列改进和调整。这些调整可能包括代码简化和转换、数据结构和内存访问优化等手段。易于理解的优化例子包括将复杂的表达式简化为更高效的等价形式;合并重复的代码块;行内展开:将函数体复制到调用位置以避免函数调用开销(-finline 启用,-fno-inline 禁用);循环解除引用:将循环变量分配到寄存器以减少内存访问(-funroll-loops 启用,-fno-unroll-loops 禁用)等。

2.优化选项 

(1)通用优化-优化等级

        GCC提供了多个优化级别,从低到高依次为-O0-O1-O2-O3-Os-Ofast

①-O0: 无优化(默认)

②-O1:基本优化。执行基本的优化操作,如删除未使用的变量、内联简单函数等。这些优化可以提高代码的执行效率,同时保持较快的编译速度。

③-O2:适度优化。进行了更多的优化操作,包括更大范围的内联、循环展开、函数调用图优化等。(推荐使用)

④-O3:积极优化。进行了更深入的优化操作,如更大范围的内联、循环变形、自动向量化等。可以进一步提高代码的性能,但编译时间可能大幅增加。(可能会改变代码行为,且使用该级别的优化后因为代码结构改变,调试会更难调试)

⑤-Os: 旨在优化代码的尺寸,尽量减小可执行文件的大小.适用于磁盘空间小或CPU缓存少的场景。

⑥-Ofast: 启用所有-O3级别的优化,同时允许不遵循严格的标准。这可能会导致不符合标准的行为(不建议使用)

(2)特定优化选项(部分)

  • -finline-functions:内联简单的函数。这可以减少函数调用的开销,但可能会增加代码大小。
  • -finline-limit=<n>:设置内联函数的最大尺寸,n 是指令数目的阈值。
  • -funroll-loops:展开循环,这有助于减少循环控制的开销,但可能会增加代码大小。
  • -fstrict-aliasing:假设不同类型的指针永远不会指向相同的内存位置。这可以使编译器生成更优化的代码,但如果代码违反了这一假设,可能会导致未定义的行为。
  • -fopenmp:支持OpenMP,用于并行编程。
  • -march=native:生成优化针对当前主机CPU指令集的代码。这可以充分利用特定CPU的特性,提高性能。
  • -mtune=native:类似-march=native,但不改变生成的指令集,只调整代码以更好地适应当前CPU的性能特性。

 3.使用

        编译阶段添加所需选型即可。

三.Valgrind

  Valgrind是一款基于linux平台开源的内存检测工具集合,功能强大,使用广泛。利用Valgrind工具,检测出动态内存隐患,即是Valgrind工具中的内存检测组件Memcheck, Memcheck支持的功能包括 :空指针使用、野指针使用、内存空间访问越界、内存空间未释放、重复释放。

1.安装和使用 

(1)安装

sudo apt install valgrind

(2)使用

在使用valgrind之前,需要在编译阶段添加 -g 调试选项 

工具指令(检测所有内存泄漏,输出指示信息到文件check.log,后跟程序及其参数):

valgrind -s --tool=memcheck --leak-check=full --log-file=check.log  ./main /dev/ttyS4

更多的使用说明或者忘记命令时,可以执行valgrind -h查看帮助信息

2.结果分析 

  详细使用分析参照本篇文章(本篇文章valgrind部分来源于此):

【代码质量】如何使用Valgrind检测内存泄漏_valgrind内存泄漏检测-CSDN博客

  在程序执行完毕后,valgrind会将提示信息打印到终端或写入文件(添加对应选项后) ,报告文件中能够指示多种内存问题。

1.常见的内存空间未释放

2.无效释放或重复释放

3。其余内存问题本处不再阐述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值