CPP开发者

其他

一大波你可能不知道的 Linux 网络工具

专家和开发者,显然还存在其他的网络监控工具,但在这篇教程中,我不打算将它们所有包括在内。上面列出的工具都有着自己的独特之处,但归根结底,它们都做着监控网络流量的工作,只是通过各种不同的方法。例如
2022年11月19日
其他

再强调一遍:Unix 不是 Linux!

Unix不包含长选项Unix命令的选项有两种写法:短选项(只有一条短线-)与长选项(有两条短线--)。短选项一般会采用缩写的形式,而长选项一般会写出完整的单词。许多工具程序都接受长选项,例如grep
2022年11月11日
其他

Linux 编程之经典多级时间轮定时器( C 语言版)

-加主页君微信,不仅C/C++技能+1主页君日常还会在个人微信分享C/C++开发学习资源和技术文章精选,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗推荐阅读
2022年11月8日
其他

​2 万字系统总结,带你实现 Linux 命令自由?

-加主页君微信,不仅C/C++技能+1主页君日常还会在个人微信分享C/C++开发学习资源和技术文章精选,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗推荐阅读
2022年10月31日
其他

C|图解指针变量

-加主页君微信,不仅C/C++技能+1主页君日常还会在个人微信分享C/C++开发学习资源和技术文章精选,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗推荐阅读
2022年10月29日
其他

Linux 程序编译过程详解

↓推荐关注↓作者:仙凌阁https://blog.csdn.net/qq_39221436/article/details/125638972大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类,一种是编译型语言,例如C,C++,Java,另一种是解释型语言,例如Python、Ruby、MATLAB
2022年9月27日
其他

C 函数指针别再停留在语法,得上升到软件设计

↓推荐关注↓经常有朋友问到底如何在C程序中采用面向对象编程?如何让模块之间松耦合?......其实究其原因还是没有把C语言与软件设计很好的联系起来。这里跟大家找了一些内容,相信认真看完全文多多少少会有你想要的答案:正文部分:记得刚开始工作时,一位高手告诉我,说,longjmp和setjmp玩得不熟,就不要自称为C语言高手。当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法。后来明白那不单是跳来跳去那样简单,而是一种高级的异常处理机制,在某些情况下确实很有用。为了显示自己的技巧,也在自己的程序中用过几次。渐渐发现这样的技巧带来的好处是有代价的,破坏了程序的结构化设计,程序变得很难读,尤其对新手来说。终于明白这种技巧不过是一种调味料,在少数情况使用几次,可以简化对问题的处理。如果把调味拿来当饭吃,一定会本末倒置,写出的程序会呈现营养不良之状。事实上,longjmp和setjmp玩得熟不熟与是不是C语言高手,不是因果关系。但是,如果可以套用那位高手的话,我倒想说如果函数指针玩得不熟,就不要自称为C语言高手。为什么这么说呢,函数指针有那么复杂吗?当然不是,任何一个稍有编程常识的人,不管他懂不懂C语言,在10分钟内,我想他一定可以明白C语言中的函数指针是怎么回事。原因在于,难的不是函数指针的概念和语法本身,而是在什么时候,什么地方该使用它。函数指针不仅是语法上的问题,更重要的是它是一个设计范畴。真正的高手当然不单应该懂得语法层面上的技巧,更应该懂得设计上的方法。不懂设计,能算高手吗?怀疑我在夸大其辞吗?那我们先看看函数指针与哪些设计方法有关:与分层设计有关。分层设计早就不是什么新的概念,分层的好处是众所周知的,比较明显好处就是简化复杂度、隔离变化。采用分层设计,每层都只需关心自己的东西,这减小了系统的复杂度,层与层之间的交互仅限于一个很窄的接口,只要接口不变,某一层的变化不会影响其它层,这隔离了变化。分层的一般原则是,上层可以直接调用下层的函数,下层则不能直接调用上层的函数。这句话说来简单,在现实中,下层常常要反过来调用上层的函数。比如你在拷贝文件时,在界面层调用一个拷贝文件函数。界面层是上层,拷贝文件函数是下层,上层调用下层,理所当然。但是如果你想在拷贝文件时还要更新进度条,问题就来了。一方面,只有拷贝文件函数才知道拷贝的进度,但它不能去更新界面的进度条。另外一方面,界面知道如何去更新进度条,但它又不知道拷贝的进度。怎么办?常见的做法,就是界面设置一个回调函数给拷贝文件函数,拷贝文件函数在适当的时候调用这个回调函数来通知界面更新状态。与抽象有关。抽象是面向对象中最重要的概念之一,也是面向对象威力强大之处。面向对象只是一种思想,大家都知道,用C语言一样可以实现面向对象的编程。这可不是为了赶时髦,而是一种实用的方法。如果你对此表示怀疑,可以去看看GTK+、linux
2022年9月20日
其他

为什么永远不会有语言取代 C / C++ ?

-加主页君微信,不仅C/C++技能+1主页君日常还会在个人微信分享C/C++开发学习资源和技术文章精选,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗推荐阅读
2022年8月30日
其他

面试常问的 16 个 C 语言问题,你能答上来几个?

声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define
2022年8月27日
其他

Linux 中断( IRQ / softirq )基础:原理及内核实现

-加主页君微信,不仅C/C++技能+1主页君日常还会在个人微信分享C/C++开发学习资源和技术文章精选,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗推荐阅读
2022年8月25日
其他

"Hello World" in C++ 23

-加主页君微信,不仅C/C++技能+1主页君日常还会在个人微信分享C/C++开发学习资源和技术文章精选,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗推荐阅读
2022年8月20日
其他

C++ 继任者?Carbon 语法速览!

class、类外定义函数等等。当然已经实现的语法部分可能不稳定,后期也可能会再有重大调整也未可知。由于当下并且没有支持Carbon语法的代码高亮插件,所以下面代码中的高亮并不准,敬请见谅。Hello
2022年8月18日
其他

杂想之一个 C++ 内存泄露案例

最近正好有个内存泄露分析的案例,和大家分享下,其带给我的一些思考。开发模型与问题发现的时机这些年来开发模型从传统的瀑布模型,逐步向敏捷开发过渡。敏捷开发将需求进行细分后,进行更快速的迭代,不断的交付,从原先瀑布模型按半年,甚至几年一次性交付,变成敏捷开发模式的1个月,2周,甚至是几天为一个交付周期。在这样的开发模式中,可以让客户更快速地使用功能给出反馈,开发人员可以及时做出调整。但从开发者的角度来看,在快速的迭代开发中,CI/CD
2022年8月16日
自由知乎 自由微博
其他

Ranges and Views in C++20

falsevec中存在元素大于0:true效果一目了解,不多作介绍。第二组,std::ranges::count_if与std::ranges::find_if。例子如下:std::vector
2022年8月11日
其他

C++ 为什么不加入垃圾回收机制

}};这个类模板是如此的简单,所以都不需要对代码进行太多地说明。这里仅仅给出一个简单的使用实例,足以说明shared_ptr作为简单的垃圾回收器的替代品。void
2022年8月9日
其他

堆内存和栈内存的区别

-加主页君微信,不仅C/C++技能+1主页君日常还会在个人微信分享C/C++开发学习资源和技术文章精选,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗推荐阅读
2022年8月4日
其他

Linux 基础—— IO 全面介绍

标准库提供注:系统调用函数与库函数尽量不要混在一起使用,可能会与统一使用的函数的运行结果有所差异文件系统文件:打开的文件、普通未打开的文件打开的文件:属性与操作方法的表现就是
2022年8月2日
其他

如何更优雅地迭代 std::tuple ?

C++11:原始迭代法std::tuple默认支持的访问方式为「索引式访问」,通过这种方式可以逐个访问结构中的元素。简单的例子:1int
2022年7月30日
其他

大规模 C++ 编译性能优化系统 OMAX 介绍

导读:本文探索&研究了大规模C/C++服务编译性能优化相关技术,优化服务性能,降低机器成本,同时为了支持规模推广应用,降低业务线接入成本,保障优化效果,进行面向云上微服务,开展平台化优化服务系统OMAX建设,并在百度推荐系统上大规模应用,取得线上服务CPU性能优化10%+和上线速度提升40%+双收益,优化后服务运行稳定,性能收益持续。一、背景随着大型互联网公司的业务不断发展,后端C++模块的逻辑处理越来越复杂,且参与开发人员众多,代码质量参差不齐,服务面临性能不断退化风险,大型程序模块,常见的通过代码上优化,主要存在以下问题:成本高:典型推荐业务服务海量代码,逻辑功能复杂,有的往往需要深入理解业务进行优化,优化门槛高效率低:模块迭代频繁,定向优化,没有一定的通用性和可持续性,往往随着迭代优化逐渐消失优势,需要不断循环往复投入开展优化二、编译优化技术简介编译优化技术,主要通过编译器或者优化工具框架来优化改写代码实现,实现性能提升,同时保障和未优化时功能上一致,对于代码开发者透明,这样可降低人工代码优化成本,提升优化效率,且可持续解决一类性能问题。目前编译性能优化技术,按照编译过程来划分,主要有编译期,链接期和编译后的优化,下面简要介绍下这些优化技术特点,使用方式和优化效果等情况。2.1
2022年7月28日
其他

对 int 变量赋值的操作是原子的吗?为什么?

-加主页君微信,不仅C/C++技能+1主页君日常还会在个人微信分享C/C++开发学习资源和技术文章精选,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗推荐阅读
2022年7月26日
其他

Linux 后台开发必知的 I/O 优化知识总结

↓推荐关注↓IO性能对于一个系统的影响是至关重要的。一个系统经过多项优化以后,瓶颈往往落在数据库;而数据库经过多种优化以后,瓶颈最终会落到IO。而IO性能的发展,明显落后于CPU的发展。Memchached也好,NoSql也好,这些流行技术的背后都在直接或者间接地回避IO瓶颈,从而提高系统性能。IO系统的分层:上图层次比较多,但总的就是三部分。磁盘(存储)、VM(卷管理)和文件系统。专有名词不好理解,打个比方说:磁盘就相当于一块待用的空地;LVM相当于空地上的围墙(把空地划分成多个部分);文件系统则相当于每块空地上建的楼房(决定了有多少房间、房屋编号如何,能容纳多少人住);而房子里面住的人,则相当于系统里面存的数据。文件系统—数据如何存放?对应了上图的File
2022年7月23日
其他

现代 C++ 测试工具链(是时候抛弃 gtest/google bench 了)

-加主页君微信,不仅C/C++技能+1主页君日常还会在个人微信分享C/C++开发学习资源和技术文章精选,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗推荐阅读
2022年7月16日
其他

C++ 反射:反射信息的自动生成!

attribute就会被AST正确的识别,我们在处理相关的节点的时候可以正确的读入它。(二)c++侧的包装-借助宏当然,考虑到业务层使用的规整性,我们使用宏对annotate做了一些包装:#if
2022年7月14日
其他

深刻理解 | 以通信方式共享内存,不要以共享内存方式通信

↓推荐关注↓题目是一句golang编程箴言,对它的理解可大可小。往小了说,golang建议使用channel来共享信息而不是使用共享内存,这是一种优雅的方式,避免了数据同步带来的繁琐和低效。往大了说,本质上还是让资源去调度请求,而不是让请求去调度资源。有些时候,思维的转变,问题的视角,会带来意想不到的收获资源就那么多,所有请求有序使用资源的方式就是通信的方式,反过来,为每个请求虚拟出它独占资源的假象,那就是共享的方式。两种截然不同的方式,差异体现在仲裁成本,这个成本决定了它们承载并发的能力。一个一个说。电路交换
2022年7月9日
其他

好文:Linux 内核概念和学习路线

↓推荐关注↓0101前言本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用与功能,以便于读者能快速理解什么是Linux内核,能看懂Linux内核。拥有超过1300万行的代码,Linux内核是世界上最大的开源项目之一,但是内核是什么,它用于什么?02什么是内核内核是与计算机硬件接口的易替换软件的最低级别。它负责将所有以“用户模式”运行的应用程序连接到物理硬件,并允许称为服务器的进程使用进程间通信(IPC)彼此获取信息。03内核还要分种类?是的,没错。3.1
2022年7月7日
其他

Linux C 基础——” Makefile “ 文件管理大师你拜访过嘛?

Make简介:工程管理器,顾名思义,是指管理较多的文件Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作==Make将只编译改动的代码文件,而不用完全编译。==会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率Makefile基本结构:Makefile是Make读入的唯一配置文件由make工具创建的目标体(target),通常是目标文件或可执行文件要创建的目标体所依赖的文件(dependency_file)创建每个目标体时需要运行的命令(command)==注意:==
2022年7月5日
其他

80% 的 Linux 都不懂的内存问题

描述符上的红黑树和链表上。然后回到用户态,通过内存分配器(ptmaloc,tcmalloc,jemalloc)算法将分配到的内存进行管理,返回给用户所需要的内存。如果用户态申请大内存时,是直接调用
2022年7月2日
其他

C++ 类库隐藏私有属性和方法的两种方式

在我们编写程序的时候,会将程序模块化,常见的就是用动态链接库的方式,然后导出函数接口或者类。而对于导出类的方式,作为模块的实现者,不论是给第三方使用或者自己的项目使用,应该都不太愿意暴露自己的私有属性和方法,个人碰到的主要有以下两个常见原因:通过隐藏私有属性和方法,让被调用者猜不到其实现方式私有方法中或者属性中,可能会存在一些第三方的头文件或者库的依赖,而对于被调用方来说不应该直接依赖本文将介绍两种方式来满足以上的需求,一种是抽象类,另一种是pimpl风格.
2022年6月25日
其他

Linux 系统调用的来龙去脉 (下)

就是执行sys_read函数,使用跳转表后程序的执行状态如下图:4.功能实现系统调用号和系统调用服务程序是一一对应关系,一个系统调用对应一个系统调用服务程序。90号系统调用对应的系统调用服务程序就是
2022年6月23日
其他

Linux 系统调用的来龙去脉 (上)

↓推荐关注↓《linux系统调用的来龙去脉》分为上下两篇,本文为上篇。1.前言开始正题前先讲两个生活小案例来引出系统调用的意义。案例一:图书馆安居不用架高堂,书中自有黄金屋。娶妻莫恨无良媒,书中自有颜如玉。图书馆是我喜欢去的一个地方,相信大家也都去过。在图书馆我们可以自由阅读任何书,广泛的汲取各种知识。正是由于所有人都可以自由的阅读任意书籍,所以经常就会出现书籍位置出现错乱,书籍页面出现损坏,甚至还会出现书籍遗失的情况。实例二:收藏馆价值连城的艺术品往往存放在特定温度和湿度的存储柜中,为了确保艺术品的安全,通常将它们存放到安全级别很高的收藏馆中。如果客户希望参观它们,先需要提交申请,进入收藏馆后,由专门的人员拿出艺术品供客户参观欣赏。这样保证了艺术品不受破坏,也保证了艺术品的安全。根据上述两个例子得出以下结论:如果每个用户都能自由使用“资源”,随着时间的推移,“资源”就会出现损坏。如果“资源”由“专业人员”管理,每个用户只能间接的使用“资源”,这样就可以安全的长久的使用“资源”。2.如何保证系统安全性操作系统提供给应用程序运行环境,让各种应用得以运行。在应用程序运行过程中有些操作是非常危险的,如果每个应用程序都能自由进行任何操作,就有可能带来如下各种问题:1、多个应用程序直接去操作硬件外设,就会出现相互冲突,可能会出现需要应用程序A的读取数据,被应用程序B读取的情况。2、多个应用程序被加载到内存,应用程序A占用了一个内存区域Z,应用程序B自己强制清空内存区域Z,那么就给应用程序A带来致命问题。3、部分应用程序需要硬件中断让自己在合适的时机开始执行,如果其它应用程序把中断关掉,那么这些依靠中断触发的应用程序将再也得不到执行。在应用程序运行过程中有些危险的操作将会对其它应用程序造成伤害,甚至会对操作系统造成伤害,导致系统崩溃。如果所有应用程序都可以使用这些操作,那么整个系统将是不稳定的,不安全的。如何防止应用程序对其它应用程序和操作系统造成伤害?造成这种问题的原因是每个应用程序都可以自由的使用关键“资源”,这就类似上文提到的图书馆模式,每个人都可以自由阅读所有书籍,所以容易出现书籍损坏(影响其它人阅读)。为了让应用程序都能正常运行不受其它应用程序伤害,为了系统能安全,稳定的长久运行,系统需要使用收藏馆模式。在收藏馆模式下关键“资源”由“专业人员”管理,每个应用程序只能间接的使用“资源”。3.特权级为了让系统系统能安全,稳定的长久运行,必须有一个有特权的“专业人员”对核心资源进行管理,那么就带来两个问题:1、专业人员的特权是什么?2、如何获取特权?特权是啥?计算机的硬件和软件是共同在发展,为了适应操作系统,处理器发展出两种权限模式:用户模式和特权模式。以ARM
2022年6月23日
其他

谷歌正寻求提高 C++ 内存安全

-加主页君微信,不仅C/C++技能+1主页君日常还会在个人微信分享C/C++开发学习资源和技术文章精选,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗推荐阅读
2022年6月21日
其他

C++ 反射:全方位解读 Lura 库的前世今生!

-加主页君微信,不仅C/C++技能+1主页君日常还会在个人微信分享C/C++开发学习资源和技术文章精选,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗推荐阅读
2022年6月18日
其他

C++ 23 将引入标准库模块支持,编译速度提升 10 倍

年发布,该版本将推进对标准库模块的支持和更快的编译。Bjarne
2022年6月17日
其他

探索 OS 的内存管理原理

Frame)图15因为页的大小是固定的,而且作为最小的分配单位,这样就可以解决段式内存管理中内存碎片的问题了。但页内仍然有可能存在内存碎片。地址转换页式内存管理使用页表(Page
2022年6月16日
其他

C++ 的单例模式为什么不直接全部使用 static,而是非要实例化一个对象?

Singleton?我只想说,如果你一定要强加这么多限定的话,那么这种设计模式的讨论本身就没有意义。就很像是在说:我自己能够保证每个new出来的指针我都能delete掉它,所以我不需要RAII……🎓
2022年6月14日
其他

C++ 编程新手容易犯的 10 种编程错误

-加主页君微信,不仅C/C++技能+1主页君日常还会在个人微信分享C/C++开发学习资源和技术文章精选,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗推荐阅读
2022年6月11日
其他

C++ 反射 第四章 标准

Statements以及源码注入这些提案的支持,因此选择基于llvm的另一个版本:lock3。lock3版本现在也没有维护了,但仍是当前最完善的实现版本,编译得半天,大家直接使用Compiler
2022年6月4日
其他

漫谈 C++:良好的编程习惯与编程要点

-加主页君微信,不仅C/C++技能+1主页君日常还会在个人微信分享C/C++开发学习资源和技术文章精选,不定期分享一些有意思的活动、岗位内推以及如何用技术做业余项目加个微信,打开一扇窗推荐阅读
2022年6月2日
其他

C++ 虚函数表剖析

↓推荐关注↓一、概述为了实现C++的多态,C++使用了一种动态绑定的技术。这个技术的核心是虚函数表(下文简称虚表)。本文介绍虚函数表是如何实现动态绑定的。二、类的虚表每个包含了虚函数的类都包含一个虚表。我们知道,当一个类(A)继承另一个类(B)时,类A会继承类B的函数的调用权。所以如果一个基类包含了虚函数,那么其继承类也可调用这些虚函数,换句话说,一个类继承了包含虚函数的基类,那么这个类也拥有自己的虚表。我们来看以下的代码。类A包含虚函数vfunc1,vfunc2,由于类A包含虚函数,故类A拥有一个虚表。class
2022年5月31日
其他

C++ 反射:第三章 原生

Baxter对C++进行了一系列扩展,增加了许多现代语言所具有的特性,便有了这个新式的C++20编译器。扩展的特性包含dynamic
2022年5月28日
其他

内存泄漏-原因、避免以及定位

作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成段错误(segment
2022年5月26日
其他

Linux 动态链接过程中的【重定位】底层原理

目录动态链接要解决什么问题?矛盾:代码段不可写解决矛盾:增加一层间接性示例代码b.ca.cmain.c编译成动态链接库动态库的依赖关系动态库的加载过程动态链接器加载动态库动态库的加载地址分析符号重定位全局符号表全局偏移表GOTliba.so动态库文件的布局liba.so动态库的虚拟地址GOT表的内部结构反汇编liba.so代码在上一篇文章中,我们一起学习了Linux系统中
2022年5月24日
其他

五万字长文总结 C/C++ 知识(下)

Protocol,用户数据报协议)端口:应用程序FTPTELNETSMTPDNSTFTPHTTPHTTPSSNMP端口号212325536980443161TCPTCP(Transmission
2022年5月21日
其他

干货推荐 :五万字长文总结 C/C++ 知识

↓推荐关注↓这是一篇五万字的C/C++知识点总结,包括答案。目录C/C++STL数据结构算法Problems操作系统计算机网络网络编程数据库设计模式链接装载库海量数据处理音视频其他C/C++const作用修饰变量,说明该变量不可以被改变;修饰指针,分为指向常量的指针和指针常量;常量引用,经常用于形参类型,即避免了拷贝,又避免了函数对值的修改;修饰成员函数,说明该成员函数内不能修改成员变量。使用//
2022年5月19日
其他

可怕!CPU 暗藏了这些未公开的指令!

我们知道,我们平时编程写的高级语言,是经过编译器编译以后,变成了CPU可以执行的机器指令:而CPU能支持的指令,都在它的指令集里面了。很久以来,我都在思考一个问题:CPU有没有未公开的指令?或者说:CPU有没有隐藏的指令?为什么会有这个问题?平常我们谈论网络安全问题的时候,大多数时候都是在软件层面。谈应用程序的漏洞、后端服务的漏洞、第三方开源组件的漏洞乃至操作系统的漏洞。但很少有机会去触及硬件,前几年爆发的熔断和幽灵系列漏洞,就告诉我们,CPU也不是可信任的。要是CPU隐藏有某些不为人知的指令,这是一件非常可怕的事情。如果某一天,某些国家或者某些团体组织出于某种需要,利用这些隐藏的指令来发动攻击,后果不堪设想。虽然想到过这个问题,但我一直没有付诸实践去认真的研究。直到前段时间,有一位老师分享了一份PDF给我,解答了我的疑惑。这份PDF内容是2017年顶级黑客大会Black
2022年5月17日
其他

提高 C++ 性能的编程技术

最近看了一本书《提高C++性能的编程技术》,这本书内容比较老,有些内容不太适合现在的编译器,但里面很多内容还是值得我们学习的。这里整理出了自认为有用的条目分享给大家,希望对大家有所帮助,想了解具体内容的的朋友可以直接去看书哈。我将这些内容分为了三大类别:对象的创建与销毁:主要介绍对象构造与销毁的代价和临时对象那些事。函数调用:主要介绍内联和虚函数及模板相关的知识点。设计:如何设计并编写出更高效的代码。下面是正文,越下面的内容越有用:对象的创建与销毁:C++中对象的定义会隐式的执行构造函数和析构函数,这是有开销的,对象的生命周期不是无偿的,至少对象的创建和销毁会消耗CPU周期。所以若非必要,不要随便定义对象,要等到需要使用对象的地方再创建它。对象的创建或销毁会触发对父对象和成员对象的递归创建或销毁,要当心复杂层次中对象的复合使用。它们使得创建和销毁的开销更加高昂。对象的拷贝是有开销的,很多时候可以减少拷贝,考虑按引用或者指针传递和返回对象。RVO可以省去创建和销毁局部对象的步骤,从而改善性能。临时对象会以构造函数和析构函数的形式降低一半的性能。在可能是“+、-、*”或者“/”的地方,可以考虑使用=运算符消除临时对象。编译器必须初始化被包含的成员对象之后再执行构造函数体。必须在初始化阶段完成成员对象的创建。这可以降低随后在构造函数部分调用赋值操作符的开销。在某些情况下,这样也可以避免临时对象的产生。将构造函数声明为explicit,可以避免隐式转换,一般这块都会被列为项目的编码规范,不符合这个规范是过不了code
2022年5月14日
其他

30 张图带你领略 glibc 内存管理精髓

。(同一大小的chunk可能有多块,在总体大小有序的情况下,要想找到下一个比自己大或小的chunk,需要遍历所有相同的chunk,所以才有fd_nextsize和bk_nextsize这种设计)
2022年5月12日
其他

【Modern C++】深入理解移动语义

一直以来,C++中基于值语义的拷贝和赋值严重影响了程序性能。尤其是对于资源密集型对象,如果进行大量的拷贝,势必会对程序性能造成很大的影响。为了尽可能的减小因为对象拷贝对程序的影响,开发人员使出了万般招式:尽可能的使用指针、引用。而编译器也没闲着,通过使用RVO、NRVO以及复制省略技术,来减小拷贝次数来提升代码的运行效率。但是,对于开发人员来说,使用指针和引用不能概括所有的场景,也就是说仍然存在拷贝赋值等行为;对于编译器来说,而对于RVO、NRVO等编译器行为的优化需要满足特定的条件(具体可以参考文章编译器之返回值优化)。为了解决上述问题,自C++11起,引入了移动语义,更进一步对程序性能进行优化
2022年5月10日
其他

又要卷?挑战 C 语言,新的系统编程语言 Hare 发布

的开发时间接近两年半,它使用静态类型系统、手动内存管理和最小运行时,非常适合编写操作系统、系统工具、编译器以及其他低级高性能任务。据
2022年5月7日
其他

80% 的 Linux 都不懂的内存问题

描述符上的红黑树和链表上。然后回到用户态,通过内存分配器(ptmaloc,tcmalloc,jemalloc)算法将分配到的内存进行管理,返回给用户所需要的内存。如果用户态申请大内存时,是直接调用
2022年5月6日