C++基础:enum class作用域枚举 (C++11) enum class 是C++11引入的一种改进的枚举机制,主要改进了传统的enum类型的作用域控制问题, 故也被称为作用域枚举(scoped enumerations)。那么,他到底解决了什么问题呢?猜到这个代码出了什么问题了吗?没错,当你尝试编译的时候,他会给你报一个write重定义的错误。实际上,enum类型在C++的体系中完全属于特例。
分布式理论:拜占庭将军问题 拜占庭将军问题是对分布式共识问题的一种情景化描述,由兰伯特于1082首次发表《The Byzantine Generals Problem》中提及,它是分布式领域最复杂的一个容错模型, 它描述了如何在存在恶意行为的情况下使分布式系统达成一致,了解拜占庭问题对于掌握分布式共识问题具有深刻意义。这个算法虽然可以保证无论叛将如何捣乱,我们都能做出一行的行为,但是这是有前提的。在兰伯特的论文中指出:如果叛将人数为m,将军人数不能少于3m+1,只有这样,口信型拜占庭将军之解才能生效。或者说,
Linux线程标识获取 这个函数提供了C++标准库级别的线程ID,可以很好和C++的 std::thread 库配合,但是很不幸,std::thread::get_id()的值也是进程内有效的,如果你没有跨进程唯一线程标识的需求,使用该函数也是很不错的选择。实际开发中,我们有多种方式来获取线程标识。该系统调用的返回值为 pid_t, 其值一般为一个小整数,它直接代表着内核的任务调度id, 该标识是全局唯一的,多个进程中的不同线程的标识也是唯一的,且 pid_t 的分配方式为轮询分配,短时间启动销毁的多个线程也会获取到不同的标识。
Linux系统编程:监视文件系统变化(inotify) 你是否有过这样的需求,监控某个文件的修改情况,一旦某个文件的内容被修改你的进程就能观察到,对准对情况进行文件备份之类的操作。在Linux 环境下,内核提供了inotify API 用于监控文件系统的情况,可以用于监视文件的创建,修改,删除等事件。inotify用于当内核发生文件系统相关的某种事件后,用于通知用户空间,方便用户做出具体的操作。inotify 可以监控单个的文件,也可以监控整个目录,当一个目录被监控时,inotify会返回关于该目录本身及其内部文件的事件。
Cmake基础教程--第2章:打印信息和变量操作 CMake项目时基于一个名为 CMakeLists.txt 的文件来构造的,注意大小写不能拼写错误。我们在CMakeLists.txt 中使用CMake Language来编写项目的构建逻辑,其语法类似与命令式编程语言。执行cmake时,会从根CMakeLists.txt 文件开始执行。
C/C++基础:宏 (a > b)?return 0;(a > b)?return 0;(a > b)?(a > b)?a : b }?(a > b)?a : b }但是如果这个宏的替换列表很长呢?// 这是正确的实现// 这是正确的实现 # define max(a , b) {
C++基础 auto 和 decltype的区别 这意味着你不需要显式写出变量的类型,编译器会根据你赋予的初始值来确定类型。这对于复杂类型、模板编程或是避免重复冗长的类型名称尤其有用,可以提高代码的可读性和编写效率。所以,decltype(x) 是变量名的规则,而 decltype((x)) 是表达式的规则,井水不犯河水,参数如果是变量名,就返回其声明的类型;除此之外,decltype还可以将表达式用()包裹,此时decltype的推导就不单单是表达式所属实体的类型,而是会继续通过表达式来推断出值类别来判断引用属性,
std::shared_ptr使用new和make_shared两种方法构造关于访问权限的区别 C++11给开发者提供了十分好用的智能指针 std::shared_ptr ,合理的使用智能指针可以一定程度的避免内存泄漏问题。int一般来说,这两个构造方法并无太大的区别,但我们更建议使用 make_shared 来创建智能指针,其在一些情况下效率更优。但今天开发时,遇到了无法使用 make_shared 而 new 操作正常的情况,本博客即记录该现象。
cmake基础教程(下) 因为 main.cpp 中调用 a.cpp 和 b.cpp 中实现的函数,我们这里将 dir1/ 和 dir2/ 下的源码编译为静态库,再链接到 main.cpp 生成的可执行文件中。同时,我们之前并没有去区分编译出的文件是release版本还是debug版本,这里我们希望能指定编译的版本,并且将对应版本的动态库放置到对应的目录下。这里注意,我们在使用静态库或者动态库的时候,除了需要库文件以外,还需要头文件,所以这里我们还需要把头文件所在的目录添加进来。用于将指定的动态库或者静态库链接到指定的可执行文件。
cmake基础教程(上) 我们希望在顶层的 CmakeList.txt 中接着调用src/下的 CMakeLists.txt 继续去构建项目,并且将最终生成的可执行文件安装到bin/下。因为构建的时候会产生大量的中间文件,一般我们会先创建一个build文件夹,在build文件夹中使用cmake命令。执行过会可以发现,build出现了大量的中间文件,并且生成了MakeFile,在build目录中使用命令。在实际的项目开发中,我们为了让项目的结构清晰,一般会有固定的模式来组织目录,下面给出一个典型的结构.
C++基础:异步操作(std::async, std::future, std::packaged_task, std::promise) std::packaged_task是一个将任务和future绑定在一起的模板,是一种对任务的封装,可以通过方法std::get_future来获得绑定的函数的返回值类型的future。C++11之后提供了实用的thread库,但 thread 在 join 的时候并不能获取到任务结束的返回值,对于刚刚介绍的异步操作async,其返回值为一个std::future对象,而不是一个确定的值,当你需要使用这个值的时候,可以调用future的get方法,get会一直阻塞,直到future就绪,然后返回该值。
C++基础:右值引用,移动语义和完美转发 顾名思义,右值引用就是对右值引用的类型,通过右值引用,右值的生命周期会获得延长,只要右值引用的变量还活着,该右值临时量就会一直活下去。其最终会输出5,换言之,左值引用也是引用,如果打印i,ref1,ref2的地址,会发现三者地址也是一样的,对ref2的修改也会改变i本身的值。forward 完美转发实现了参数在传递过程中保持其值属性的功能,即若是左值,则传递之后仍然是左值,若是右值,则传递之后仍然是右值。在C++11以后,C++所有的值都必属于左值,将亡值,纯右值三者之一,其中,将亡值和纯右值都属于右值。
C++基础:智能指针 在创建智能指针时,可以给对象指定一个删除器,当智能指针的引用计数为零时,会自动调用该删除器来释放对象的内存,比如我们用std::shared_ptr来管理动态数组,std::shared_ptr的默认删除器不支持删除数组对象,我们就可以指定删除器。std::shared_ptr使用引用计数来保证浅拷贝的内存释放问题,每一个shared_ptr的拷贝都会指向同一块内存,只有当最后一个shared_ptr拷贝析构的时候,才会将其指向的内存释放。相对于原始指针来说,智能指针不需要手动释放内存,其内存会自动释放。
C++面向对象基础:设计模式(下) 代码解释:上述代码中,如果我们希望创建ExportXm, ExportJson或者ExportTxt类的对象并使用其Export方法,我们可以创建一个其对应的工厂类实例并用于初始化总工厂ExportData对象,然后就可以通过ExportData实例来使用你需要的类的方法。抽象工厂是工厂方法模式的一种变种,为了缩减工厂实现子类的数量,不必给每一个产品分配一个工厂类,可以将产品进行分组,每组中的不同产品由同一个工厂类的不同方法来创建。为每一个子类建立一个对应的工厂子类,这些工厂子类实现同一个抽象工厂接口。
C++面向对象基础:设计模式(中)-- 单例模式详解 当持有锁的线程执行到new操作时,若其仅仅执行到1->2但还并未调用构造函数,此时会出现这样的情况:_instance指针已经拿到了new的返回值,此时已经不是nullptr,但因为还没有调用构造函数此时的_instance还没有实际的数据,而处于其他地方的线程可能会在这个时候直接将_instance返回并使用,这会导致严重的线程安全问题,这绝不是我们希望发生的。这个设计模式的定义实在是简单明了,也是最常用的设计模式,用该设计模式可以定义一个类仅会有一个实例对象,并且可以全局访问。注意这里实现的几个细节。
C++面向对象基础:设计模式(上) 通过该设计模式,只要DataCenter类的CalcTemperature方法发生改变,我们都可以调用Nodify方法使得所有订阅了该类的终端发生变化,是否订阅也取决于客户,DataCenter不关心是否有类订阅了自身。如以上代码,使用模版方法模式,我们可以在保证Show方法总体结构不变的情况下,通过子类重写父类的protected方法,来改变Show的部分执行过程。设计模式可以认为是解决问题的固定套路,是满足设计原则的情况下,慢慢迭代出来的套路,学习设计模式,可以让我们深入理解面向对象的思想。
git push 推送代码出错ssh: Could not resolve hostname gitee.com: Temporary failure in name resolution 师兄说过:重启解决百分之99的问题,师兄诚不欺我。遇到奇怪的错误,都不妨关机重启试试,说不定就解决了呢?
Git基础教程 Git和GitHub或者Gitee并不是一种东西,GitHub是基于Git的代码托管服务平台,而Git则是分布式版本控制系统。可以把Gitee看成一个百度云盘,我们可以把git仓库推送至Gitee,或者把Gitee的git仓库拉取下来,对比百度云盘,Gitee的功能则可以和Git无缝衔接。