![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 89
leapmotion
这个作者很懒,什么都没留下…
展开
-
从unique_ptr看函数调用约定
本文中其实是两个主题,一个是unique_ptr在参数传递和裸指针对比,unique_ptr使用内存传递,因为unique_ptr内部本身就是封装了指针,这就导致unique_ptr传递时会多一层。也是参考视频中提到的可能没有零成本的抽象吧。另外一个就是我们扩展了下其他类型的参数是走寄存器传递还是内存传递,也举例说明了下。不过这里省略了SIMD类型的参数。其中可能那里不对,请大家指出,共同进步。原创 2024-05-07 07:39:13 · 860 阅读 · 1 评论 -
从unique_ptr看空基类优化
本文通过从unique_ptr出发来看其在不同形式的删除器下的大小,从而得到unique_ptr中使用tuple来实现,进一步看tuple实现,得出对于其保存的数据来说,有成员存储和基类继承两种形式,而基类继承的形式如果是空基类的话又会对其进行优化。我们学习了unique_ptr的部分源码,tuple的部分源码,对于数据存储我们也学习到可以使用基类继承的形式。原创 2024-04-11 21:46:50 · 682 阅读 · 0 评论 -
C++的算法和KISS原则
优先使用算法的准则依然有效:无论什么时候,如果你看到了for循环,确认下是不是可以被算法替代或者ranges,然后这个准则更像一个指导方针:不要盲目跟随,而是要有意识地做出选择,选择那些更简单、更易读的方法,并注意其他替代方法,比如迭代器范围构造函数。翻译 2024-03-29 07:46:36 · 32 阅读 · 0 评论 -
C++设计模式之访问者模式
访问者模式是可以将数据结构体和该结构体使用的算法分离的一种设计模式,属于行为型模式,在一些算法抽象情况下可能会用到。访问者模式可以做到在不修改一个类的情况下,向该类添加一些操作。当你在修改源码不太可能时,针对于类的操作,可以单独提供访问者类来实现。举例来说,比如说序列化每个类都知道如何序列化自己需要序列化到磁盘,缓冲区,socket等等目的地(destination)一个可选的方案是,写一个很大的函数,用来将目的地和类组合或者使用访问者模式,将类和序列化操作分离开。原创 2024-03-20 07:54:04 · 1044 阅读 · 0 评论 -
constexpr与函数参数转发
本篇文章就是和大家探讨下constexpr的参数传递的问题,可以使用非类型模板参数,宏定义,lambda表达式做到。原创 2024-02-26 12:12:33 · 752 阅读 · 0 评论 -
C++用宏实现类成员反射
这里我们使用宏来实现了结构体(或类)成员的反射,包括成员的个数,成员的指针,成员的类型。有了这些我们就可以做一些基本的操作了,比如说一些序列化结构体等等。同时我们还展示了TypeList及相关的简单操作。当然你如果需要的话,也可以将TypeList操作丰富起来。原创 2024-01-08 07:08:14 · 1093 阅读 · 0 评论 -
C++ 如何设计好用的API
好用的c++ api原创 2023-12-13 06:41:02 · 192 阅读 · 0 评论 -
C++现代模板元编程
现代模板元编程原创 2023-12-05 07:20:04 · 107 阅读 · 0 评论 -
如何通过模板和友元来骇客C++
友元和模板是C++中强大的工具,就像 C++ 中的其他工具一样,它们的行为会让我们大吃一惊。而当结合在一起时会变得令人困惑的行为。并不是说C++的这些方面很少见,而是它们再次证明了语言已经变得多么复杂。翻译 2023-08-20 07:41:19 · 93 阅读 · 0 评论 -
C++与依赖注入
S 单一职责原则O 开闭原则L 里氏替换原则I 接口隔离原则D 依赖倒置原则那与我们相关的也是依赖倒置原则,描述为我们的class应该依赖接口和抽象类而不是具体的类和函数。那么依赖注入也是符合这个原则,简单理解来说就是当依赖的某个对象是通过外部来注入,而不是自己创建。依赖应该大家都是知道的吧,举个最简单的例子:这里我们就可以说Human这个类依赖于Tools,那么我们说的对于这个依赖项是从外部创建继而注入到这个类中。原创 2023-07-07 07:32:53 · 1482 阅读 · 0 评论 -
由libunifex来看Executor的任务构建
之前的一篇文章讲述了future的优缺点,以及future的组合性,其中也讲述了构建任务DAG一些问题,同时给出了比较好的方案则是Executor。Executor还未进入标准(C++23),Executor拥有惰性构建及良好的抽象模型来构建任务DAG,libunifex则给出了相当具有标准的实现,我们也借助libunifex的简短的代码来看下构建任务DAG的便利性。原创 2023-04-10 07:55:29 · 499 阅读 · 1 评论 -
lambda演进史(C++14/17/20)
lambda翻译 2023-03-12 18:03:19 · 257 阅读 · 0 评论 -
谈C++的future
future原创 2023-03-07 21:40:17 · 2147 阅读 · 0 评论 -
源码看CAF的线程调度框架
CAF原创 2023-01-15 22:18:16 · 756 阅读 · 0 评论 -
C++之SFINAE
SFINAE原创 2022-10-23 10:11:26 · 858 阅读 · 0 评论 -
从源码看std::weak_ptr
weak_ptr原创 2022-06-25 09:42:14 · 536 阅读 · 0 评论 -
解析C++中std::ref
1. 前言关于c++中的std::ref,std::ref在c++11引入。本文通过讲解std::ref的常用方式,及剖析下std::ref内部实现,进而再来讲解下std::reference_wrapper,然后我们再进一步分析为什么使用std::ref。2. std::ref 用法简单举例来说:int n1 = 0;auto n2 = std::ref(n1);n2++;n1++;std::cout << n1 << std::endl; // 2std:原创 2021-09-16 21:45:25 · 9721 阅读 · 9 评论 -
谈一谈std::forward
上篇文章我们讲了移动语义相关知识本篇文章我们介绍下std::forward,我们会讲到引用折叠,完美转发,及std::forward与std::move进行比较1 引用折叠我们都知道通常情况下不能将一个右值引用绑定到左值上,即:int i = 0;int &&ii = i; // error当然也有例外的情况,左值传递给右值引用参数,且右值引用指向模板类型参数(T&&)template<typename T>void foo(T&&am原创 2021-03-09 07:55:05 · 706 阅读 · 0 评论 -
C++ 如何使用移动语义
1 前置c++11引入了右值引用和移动语义,可以避免一些拷贝,提高程序运行的性能。本文我打算简单介绍下左值右值及相关的概念,着重介绍如何使用移动语义,为什么使用以及怎么使用2 左值和右值看一条简单的赋值语句int a = 0;我们最简单的理解是,可以放到等号左边的是左值,只能放到右边的是右值。这个理解不能称之为错误,但是有些改动及例外,根据标准,左值即可以是有名字的,可以取地址的,右值不具名,不可以取地址,例如常见的字面量,函数返回值。int get() { return 0;}/原创 2021-02-01 15:47:34 · 986 阅读 · 0 评论 -
C++的optional解析
optional用法1 问题引出编程中我们可能会遇到要处理可能为空的变量,比如说容器,基本类型,或者说对象实例,我们简单看个例子:#include <string>#include <vector>#include <memory>struct Some{ int some_i_ = 0; std::string some_str_;};SomegetSome(const std::vector<Some>& s原创 2020-08-16 23:02:20 · 12612 阅读 · 1 评论 -
内存模型下的顺序一致性
什么是内存模型在多核多线程环境下,多个CPU是如何以一种统一的方式来与内存交互的,这里包括内存地址对线程的可见性,cpu对内存的访问的顺序性。关于乱序我们先来看代码:#include <thread>#include <iostream>using namespace std;bool ok = true;int val = 0;void foo() { while (1) { if (!ok) { cout &l原创 2020-08-05 08:04:57 · 446 阅读 · 0 评论