之前的“性能优化的一般策略及方法”一文中介绍了多种性能优化的方法。根据以往的项目经验,开启编译器优化选项可能是立竿见影、成本最低、效果最好的方式了。 这么说可能还不够直观,举个真实的例子:我所参与的自动驾驶的项目中,无需修改任何代码,仅仅增加一个-O2选项,进程整体的CPUloading可以从50%降到30%左右,某些关键函数的执行时间可以从1700us降低到700us左右。 编译器能优化能力远比你想象中的强大!往后翻翻附录,看看那些多到让人眼花的优化选项你就知道,很多的人工优化都是不必要的,编译器会做得更快,更好,更安全!人工优化,不仅会降低代码的可读性和可维护性,而且非常容易引入bug! ...

  caNvJ57TXG2K   2024年03月16日   42   0   0 嵌入式

TLDR 修饰变量的时候,可以把constexpr对象当作加强版的const对象:const对象表明值不会改变,但不一定能够在编译期取得结果;constexpr对象不仅值不会改变,而且保证能够在编译期取得结果。如果一个const变量能够在编译期求值,将其改为constexpr能够让代码更清晰易读。 constexpr函数可以把运行期计算迁移至编译期,使得程序运行更快(但会增加编译时间)。但如果constexpr函数中存在无法在编译期求值的参数,则constexpr函数和普通一样在运行时求值,此时的返回值不是常量表达式。 1.常量表达式和constexpr C11中引入了constexpr...

  caNvJ57TXG2K   2024年02月20日   21   0   0 C++

本文尝试回答: 现代C有哪几种初始化形式?分别能够用于什么场景?有什么限制? MyClassobj();为什么没有调用默认无参构造函数创建一个对象? newint和newint()有什么区别? 直接初始化、拷贝初始化、列表初始化、默认初始化、值初始化、类内初始值、构造函数初始值列表的区别与联系? 初始化和赋值的区别? 类成员有几种初始化方式,其初始化顺序是由什么决定的? 初始化相关的注意事项及最佳实践? 1.内置类型和类类型 正式开始介绍初始化之前,先要区分C中的两种数据类型:内置类型和类类型。 内置类型:char、bool、short、int、float、double、指针等C语言支持...

  caNvJ57TXG2K   2024年02月19日   88   0   0 C++

C学习宝藏网站分享 1.C在线参考手册Cppreference https://zh.cppreference.com C开发者必备的在线参考手册,是我最常访问的C网站之一。作为参考手册,不仅包含了语言本身的词法、语法特性,还包含了对C标准库的介绍:需要include哪个头文件、接口参数/返回值说明、参考实现、示例代码、各家编译器的支持情况等。 参考手册就好像字典,对于大多数的开发人员来说,不需要从头看到尾。点开几个链接,看看里面有哪些内容,大致留个印象,具体用到了某个部分再来查阅即可。 如果一开始看起来有些吃力,就直接放弃了这个C宝藏网站,实在是太可惜了。可以先看下《CPrimer》之...

  caNvJ57TXG2K   2024年01月14日   15   0   0 C++

C核心指南——性能 阅读建议:先阅读《性能优化的一般策略及方法》 截至目前,CCoreGuidelines中关于性能优化的建议共有18条,而其中很大一部分是告诫你,不要轻易优化! 非必要,不优化 Per.1:不要无故优化 Per.2:不要过早优化 Per.3:只优化少数关键代码 前三条可以总结为:非必要,不优化。所谓的“优化”,是指牺牲可读性、可维护性,以换取性能提升(否则应该作为编程的标准实践)。优化可能引入新的bug,增加维护成本。软件工程师应把重心放在编写简洁、易于理解和维护的代码,而不是把性能作为首要目标。 先测量,再优化 如果性能非常重要,应该通过精确地测量,找到程序的hot...

  caNvJ57TXG2K   2023年12月25日   16   0   0 翻译区

性能优化的一般策略及方法 在汽车嵌入式开发领域,性能优化始终是一个无法回避的问题: 座舱HMI想要实现更流畅的人机交互 通信中间件在给定的CPU资源下,追求更高的吞吐量 更一般的场景:嵌入式设备CPU资源告急,需要降低CPU使用率... 不同的工程师会从不同的角度给出不同的优化建议: 有人关注系统调用情况 有人建议从算法和数据结构入手 有人建议避免递归、循环嵌套 有人会从存储器层次结构出发,建议修改代码提高缓存命中率来提升性能 ... 这些都是具体的代码调优技术/技巧,或许有效,但不够系统。本文不讨论具体的代码调优技术,而是想介绍下具体代码优化技巧之上,更高层次的优化策略。比起代码级别...

  caNvJ57TXG2K   2023年11月27日   17   0   0 读书区

C里面有一些惯用法(idioms),如RAII,PIMPL,copy-swap、CRTP、SFINAE等。今天要说的是PIMPL,即PointerToImplementation,指向实现的指针。 问题描述 在实际的项目中,经常需要定义和第三方/供应商的C接口。假如有这样一个接口文件: MyInterface.h include<string> include<list> include"dds.h" classMyInterface{ public: intpublicApi1(); intpublicApi2(); private: intprivateMeth...

  caNvJ57TXG2K   2023年11月02日   51   0   0 C++

C惯用法之Copy-Swap拷贝交换 这是“C惯用法”合集的第3篇,前面2篇分别介绍了RAII和PIMPL两种惯用法: RAII:ResouceAcquistionIsInitialization PIMPL:PointerToImplemetation 正式介绍Copy-Swap之前,先看下《剑指Offer》里的第☝️题: 如下为类型CMyString的声明,请为该类型添加赋值运算符函数。 classCMyString{ public: CMyString(charpData=nullptr); CMyString(constCMyString&str); CMyString...

  caNvJ57TXG2K   2023年11月02日   18   0   0 C++

单例模式是设计模式中最简单、常见的一种。其主要目的是确保整个进程中,只有一个类的实例,并且提供一个统一的访问接口。常用于Logger类、通信接口类、线程池等。 基本原理 限制用户直接访问类的构造函数,提供一个统一的public接口获取单例对象。 这里有一个“先有鸡还是先有蛋”的问题: 因为用户无法访问构造函数,所以无法创建对象 因为无法创建对象,所以不能调用普通的getInstance()方法来获取单例对象 解决这个问题的方法很简单,将getInstance()定义为static即可(这也会限制getInstance()内只能访问类的静态成员) 注意事项 所有的构造函数是private的...

  caNvJ57TXG2K   2023年11月01日   31   0   0 设计模式

目录 封装变化 针对接口编程,不针对实现编程 多用组合(has-a),少用继承(is-a) 为交互对象之间的松耦合设计而努力 最少知识原则LKP/迪米特法则LawofDemeter 好莱坞原则 SOLID原则 单一职责原则SRP 开放关闭原则OCP 里氏替代原则LSP 接口隔离原则ISP 依赖倒置原则DIP DRY原则 KISS原则 封装变化 找出应用中需要经常变化的部分,把他们独立出来,改变这部分代码不影响其他部分。这几乎是每个设计模式背后的精神所在,即系统中某部分的改变不影响其他部分。 针对接口编程,不针对实现编程 针对接口编程,关键在于多态。变量/成员/形参的声明应该是抽象类/接...

  caNvJ57TXG2K   2023年11月01日   148   0   0 设计模式

计算机编程发展至今,一共只有三个编程范式: 结构化编程 面向对象编程 函数式编程 编程范式和软件架构的关系 结构化编程是各个模块的算法实现基础 多态(面向对象编程)是跨越架构边界的手段 函数式编程是规范和限制数据存放位置与访问权限的手段 软件架构的三大关注重点:功能性、组建独立性以及数据管理,和编程范式不谋而合 结构化编程 限制控制权的直接转移,禁止goto,用if/else/while替代 Dijkstra发现:goto语句的某些用法会导致模块无法被递归拆分成更小的、可证明的单元,这会导致无法采用分解法将大型问题进一步拆分成更小的、可证明的部分。 Bohm和Jocopini证明了:...

  caNvJ57TXG2K   2023年11月01日   38   0   0 架构设计

前段时间在看《架构整洁之道》,里面提到了:构建一个好的软件系统,应该从写整洁代码做起。毕竟,如果建筑使用的砖头质量不佳,再好的架构也无法造就高质量的建筑。趁热打铁,翻出《代码整洁之道》再刷一遍。 《代码整洁之道CleanCode》学习笔记Part1 衡量代码质量的唯一标准:WTF/min 第一章整洁代码 糟糕代码的代价 理解、维护成本高。每次修改影响到好几处代码 每次修改都会产生意想不到的问题,导致惧怕、抵触改动 初期进展“迅速”,后续生产力持续下降,趋向于零 破窗理论:如果对糟糕的代码放任不管,就会使人们争相效仿,甚至变本加厉 不要想着先写出糟糕的代码,然后改进。勒布朗法则:Late...

  caNvJ57TXG2K   2023年11月01日   44   0   0 读书区

C核心指南(CCoreGuidelines)是由BjarneStroustrup、HerbSutter等顶尖C专家创建的一份C指南、规则及最佳实践。旨在帮助大家正确、高效地使用“现代C”。 这份指南侧重于接口、资源管理、内存管理、并发等High-level主题。遵循这些规则可以最大程度地保证静态类型安全,避免资源泄露及常见的错误,使得程序运行得更快、更好。 R.ResourceManagement 本章的基本目标是:不产生资源泄漏,不持有不再需要的资源。资源是指需要申请和(显式或隐式)释放的任何东西,如内存、文件句柄、套接字、锁等。如果一个实体“拥有”资源,则意味着该实体负责释放资源。在个别场...

  caNvJ57TXG2K   2023年11月01日   63   0   0 翻译区

C核心指南(CCoreGuidelines)是由BjarneStroustrup、HerbSutter等顶尖C专家创建的一份C指南、规则及最佳实践。旨在帮助大家正确、高效地使用“现代C”。 这份指南侧重于接口、资源管理、内存管理、并发等High-level主题。遵循这些规则可以最大程度地保证静态类型安全,避免资源泄露及常见的错误,使得程序运行得更快、更好。 R.alloc:分配和释放 R.10:避免使用malloc()/free() R.11:避免显式调用new/delete R.12:显式资源分配的结果应立即给到资源管理对象 R.13:在一条语句中,最多只能有一个显式资源分配 R.14...

  caNvJ57TXG2K   2023年11月01日   47   0   0 翻译区

C核心指南(CCoreGuidelines)是由BjarneStroustrup、HerbSutter等顶尖C+专家创建的一份C指南、规则及最佳实践。旨在帮助大家正确、高效地使用“现代C”。 这份指南侧重于接口、资源管理、内存管理、并发等High-level主题。遵循这些规则可以最大程度地保证静态类型安全,避免资源泄露及常见的错误,使得程序运行得更快、更好。 R.smart:智能指针 R.20:使用unique_ptr或shared_ptr来表示所有权 R.21:除非需要共享所有权,否则优先使用unique_ptr而不是shared_ptr R.22:使用make_shared()创建s...

  caNvJ57TXG2K   2023年11月01日   32   0   0 翻译区

C核心指南(CCoreGuidelines)是由BjarneStroustrup、HerbSutter等顶尖C+专家创建的一份C指南、规则及最佳实践。旨在帮助大家正确、高效地使用“现代C”。 这份指南侧重于接口、资源管理、内存管理、并发等High-level主题。遵循这些规则可以最大程度地保证静态类型安全,避免资源泄露及常见的错误,使得程序运行得更快、更好。 文中提到的GSL(GuidelinesSupportLibrary)是C核心指南支持库https://github.com/Microsoft/GSL P:Philosophy基本理念 本节的规则反映了现代C的哲学/基本理念,贯穿...

  caNvJ57TXG2K   2023年11月01日   55   0   0 翻译区

C核心指南(CCoreGuidelines)是由BjarneStroustrup、HerbSutter等顶尖C+专家创建的一份C指南、规则及最佳实践。旨在帮助大家正确、高效地使用“现代C”。 这份指南侧重于接口、资源管理、内存管理、并发等High-level主题。遵循这些规则可以最大程度地保证静态类型安全,避免资源泄露及常见的错误,使得程序运行得更快、更好。 文中提到的GSL(GuidelinesSupportLibrary)是C核心指南支持库https://github.com/Microsoft/GSL P:Philosophy基本理念 本节的规则反映了现代C的哲学/基本理念,贯穿...

  caNvJ57TXG2K   2023年11月01日   47   0   0 翻译区
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~