- 博客(27)
- 资源 (2)
- 收藏
- 关注
原创 无锁多生产者多消费者简单实现
push 和 pop 中的 std::this_thread::yield 可以优化使用 std::atomic_flah 的 wait 和 notify 来提升性能。- push 目前只有左值。
2025-03-19 11:42:21
193
原创 nullptr、三向比较运算符、线程局部存储
nullptr是 C++11 引入的一种关键字,用来表示空指针。它的引入主要是为了取代传统的NULL和0,从而避免由于类型不匹配带来的潜在问题。使用nullptr有助于提高代码的可读性和类型安全性。
2024-10-19 11:27:41
523
原创 结构化绑定、noexcept、类型别名和别名模块
函数不会抛出异常时,可以省略异常处理的代码路径,提升性能。是一种方便的语法糖,用于为复杂类型或模板创建更简洁的名字。类型别名是在 C++11 中引入的,它为我们提供了一种比。:如果你的类定义了移动构造函数或移动赋值运算符,并且它们不会抛出异常,最好将它们声明为。别名模板允许我们为模板创建别名,简化模板类型的表达。在 C++ 中,结构化绑定是一种方便的语法糖,用于从复杂的对象(如元组、数组、类型别名是一种为已有类型创建新的名称的方式,类似于早期的。,这样可以保证当容器需要移动对象时,使用更高效的操作。
2024-10-15 23:22:09
400
原创 基于范围的for循环、支持初始化语句的if和switch、static_assert
declaration:定义一个变量,用于表示每次迭代中当前的元素。expression:表示要遍历的范围,可以是数组、容器或者任何支持迭代器的对象。init声明的变量的生命周期伴随整个if结构,包括else if和else部分。statement:循环体中的语句,可以是任何有效的 C++ 语句。在c++20中添加基于范围的for循环对初始化语句的支持。init声明的变量的生命周期伴随整个switch结构。定义了以对象类型为参数的begin和end普通函数。实现支持基于范围的for循环的自定义类。
2024-10-13 23:36:18
402
原创 C++协程
协程就是一段可以挂起(suspend)和恢复(resume)的程序,一般而言,就是一个支持挂起和恢复的函数。函数挂起:函数执行到某个位置后,可以停止执行当前函数,并将控制权转移给其他函数(注意,此处的转移不是return,会记录当前函数的状态(协程状态coroutine state),如输入参数,使用到的变量(变量是值拷贝还是引用或指针,引用和指针需要程序员确保变量的生命周期),控制权转移的位置等)。函数恢复:再次进入到该函数时,查询函数的执行状态,从上一次转移的位置继续执行。
2024-06-16 20:29:26
447
原创 std::async异步变同步的原因
未存储对象std::async的默认行为是当对象销毁时阻塞主线程,直到异步任务完成。存储对象:可以显式地控制等待异步任务完成的时机。
2024-06-06 21:13:59
258
原创 C++高性能编程---04.数据结构
容器适配器表示可以由序列式容器实现的抽象数据结构(stack、queue、priority_queue)
2024-04-14 20:41:30
297
1
原创 C++高性能编程---03.C++分析和度量性能
1.渐进复杂度和大O符号大O表示法 均摊时间复杂度分析2.度量什么?该如何度量定义目标:(优化目标,延迟/响应时间、吞吐量、内存使用、IO绑定或CPU绑定:性能与IO有关还是与CPU有关、耗电量、数据聚合) 度量 找到瓶颈 做有根据的猜测 优化 评估 重构3.了解代码和热点插桩型剖析器 采样型剖析器4.微基准测试(Google Benchmark https://github.com/google/benchmark)优先使用剖析器找到需要调整的热点 将之与其他代码分
2024-04-08 12:00:00
270
1
原创 C++高性能编程---01.C++概述
C++是一种高度可移植的编程语言,具有零成本抽象的能力,使开发者能够编写和管理大型、表达力强且健壮的代码库。
2024-04-07 08:30:00
398
1
原创 Effective C++学习---09.杂项讨论
条款53:不要轻易忽视编译器的警告严肃对待编译器发出的警告信息,确保对警告信息有深刻的理解后,可以选择忽略某些警告信息(确保充分了解引起警告的原因,以及对应的影响) 不要过度依赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同条款54:让自己熟悉包括TR1在内的标准程序库(std::experimental中的实验功能)条款55:让自己熟悉Boost
2024-04-06 14:51:01
198
1
原创 Effective C++学习---08.定制new和delete
条款49:了解new-handler的行为set_new_handle允许客户指定一个函数(new-handler),在内存分配无法满足时被调用,只有当new_handler==nullptr时,operator new才会抛出异常 nothrow new是一个颇为局限的工具,只能保持new操作不抛出异常,但无法保证后续类的构造函数不抛出异常条款50:了解new和delete的合理替换时机用来检测运用上的错误(用户可以添加一些自己的机制,检测内存使用或释放上的错误) 为了强化效能 为了收集使
2024-04-06 11:05:36
296
1
原创 Effective C++学习---07.模板与泛型编程
在template实参推导过程中从不将隐式类型转换函数(通过构造函数发生的隐式转换)纳入考虑当编写一个类模板时,某些函数与typename相关,当这些函数的参数涉及隐式类型转换时,最好将该函数定义为类模板内的friend函数。
2024-04-06 08:00:00
328
1
原创 Effective C++学习---06.继承与面向对象设计
静态绑定:在编译期确定动态绑定:在运行期确定对于继承而言,非虚函数不允许重新定义,因此本条款主要描述的是虚函数,对于虚函数而言,其是动态绑定的,而缺省参数值是静态绑定的。也就导致如果通过父类的指针或引用调用虚函数,实际调用的是子类的虚函数,但是参数值却是父类的缺省值而不是子类的缺省值条款38:通过复合塑模出has-a或“根据某物实现出”(is-implemented-in-terms-of)
2024-04-05 15:34:26
408
1
原创 Effective C++学习---04.设计与声明
理想上,如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不该通过编译;如果代码通过了编译,它的行为就该是客户所想要的。
2024-04-04 17:09:57
682
1
原创 无锁环形缓冲区(ring buffer)--单生产者单消费者场景
无锁环形缓冲区是一种多线程环境下用于在单生产者和单消费者之间安全传递数据的数据结构,它通常使用原子操作来保证线程安全性,而不需要使用显式的锁。这种数据结构通常用于提高多线程程序的性能,因为无锁操作比锁操作具有更低的开销。
2024-04-03 17:54:27
1666
1
原创 Effective C++学习---03.资源管理
资源:进程从操作系统申请,并要在合适的时机返还给操作系统,否则就会导致资源泄露;常见的资源有:堆内存(手动申请,使用结束后释放),文件描述符,互斥锁,网络socket等。
2024-04-03 11:18:01
1121
1
原创 Effective C++学习---01.让自己习惯C++
将C++视为一个由相关语言(次语言)组成的联邦,而非单一语言面向过程编程面向对象编程面向泛型编程STL:标准库对于内置的数据类型(C-like),pass-by-value(传值)通常比pass-by-reference(传引用)高效,对于Object-Oriented C++用户自定义(user-defined)数据类型,pass-by-reference(传引用)通常比pass-by-value(传值)高效。
2024-04-02 19:41:54
740
1
原创 数据结构与算法--如何使用堆模拟栈实现快速排序
快速排序是一种常用的排序算法,它通过选择一个基准元素,将数组分割成小于基准的部分和大于基准的部分,然后递归地对这两部分进行排序。因此快速排序的递归函数实现,就是将一个无序数组划分为小于基准的部分,基准元素,大于基准的部分,然后递归的对小于基准的部分和大于基准的部分进行重复调用递归函数。输出:将输入的序列划分为三部分,小于基准的部分,基准元素,大于基准的部分。得到的小于基准的部分和大于基准的部分要压入栈中。函数重复的从堆中弹出和压入元素,无须递归的进行函数调用,直到栈为空的时候,表示排序完成。
2023-08-20 21:23:10
184
1
原创 VS2019中创建OpenDDS项目
VS2019中创建OpenDDS项目1.新建VS项目2.添加编译头文件目录和编译需要的动态库1.添加头文件目录2. 添加动态链接库所需要的相关文件3.添加C++编程文件1.编译IDL文件2.将idl文件所在目录添加到项目头文件包含目录中3.编写OpenDDS数据发布者4.编写OpenDDS数据订阅者4测试运行1.新建VS项目项目名称自己命名即可,此处注意release/debug,32/64要与OpenDDS编译版本一致2.添加编译头文件目录和编译需要的动态库1.添加头文件目录打开项目属性性,
2021-04-19 17:15:46
946
3
原创 OpenDDS
OpenDDS Windows10安装步骤1.OpenDDS相关文件下载2.安装perl3.OpenDDS安装安装版本系统环境:Windows10Microsoft Visual Studio版本:vs2019perl版本:ActivePerl-5.28DDS版本:OpenDDS-3.14TAO版本:2.2aACE版本:6.2a_p171.OpenDDS相关文件下载相关文件已上传,正在审核,也可以直接到官网下载;所需文件:1.perl2.tao,ace3.opendds3.142
2021-04-19 16:47:17
412
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人