![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++语法
文章平均质量分 94
李兆龙的博客
Distributed Systems & NoSQL & Linux Kernel / eBPF & Chaos Engineering
展开
-
一个魔数引发的学习
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。引言在看Redis的代码的时候偶然间发现了一个魔数(叫魔数也不完全对,因为是一个规范的排列),就是下面这个东西:antirez大哥在注释中留下的一个链接很有意思,于是就抱着学习的态度周末浏览下这篇文章,顺便记录下学到的东西,这是这篇文章的由来。这应该是facebook的某个大牛工程师技术分享的主题,原文中留下了分享的视频和PPT,不过视频原创 2021-08-07 18:07:37 · 311 阅读 · 0 评论 -
请清除所有warning,至少清楚为什么warning
引言其实这还是一篇记录bug修复的文章,以前写这类文章的时候喜欢起一个“问题解决:XXXX”的题目,清晰有余,故事性则欠缺不少,自己在日后看到时多多少少忘了写那篇文章时的场景,既然二百多篇文章都过来了,现在为什么又突然开始矫情起来呢?究其原因,还是以前在学校时时间太过幸福了,有那么多时间去做这样的输出,所以写文章初始的那份快乐早就从夏天的第一口可乐,清晨路上偶遇的清纯妹子这种显而易见的愉悦变成了麻木的敲键盘了。直到现在每天累死累活的时候才知道这种闲暇的输出有多么有趣,多么值得被回忆,所以对抗狗日的生活的原创 2021-06-10 15:31:27 · 330 阅读 · 0 评论 -
C++20特性一览
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。rangejthread<=>modulecoroutineattribute[likely, unlikely,no_unique_address]Designated InitializersConcepts 不太会std::formatatomic支持浮点数和smart ptrconsteval指派初原创 2021-02-25 22:46:22 · 2230 阅读 · 0 评论 -
C++17特性一览
文章目录引言构造函数模板推导结构化绑定if-switch语句初始化内联变量折叠表达式constexpr lambda表达式namespace嵌套from_chars函数和to_charsstd::shared_mutexstd::variantstd::optionalstd::anystd::applystd::make_from_tuplestd::string_viewstd::file_system并行算法库constexpr if引言这一系列的第二篇文章。但是其实我并不想写第三篇,也就是描述C原创 2020-10-02 20:18:37 · 9981 阅读 · 0 评论 -
C++14特性一览
引言打算花两天时间写三篇文章,把C++14,17,20已有的新特性说一说,为什么突然心血来潮想干这个事情呢,原因是在上课某个划水的课的时候玩手机看到了GCC最新的10.2.0版本在今年七月二十三号的时候已经发布了,在这个版本中已经支持了协程,并且在9月4日C++ 20的国际标准草案投票结束,而且获得了全票通过,这实在是让人心血澎湃啊!果断升级到最新版本,却猛然发现已经把C++11以上版本的特性忘的差不多了,恰好明天国庆,遂今天给自己放放假,就不动脑子了,边听歌边复习下这些特性吧。变量模板与别名模板《C原创 2020-10-02 20:18:28 · 5111 阅读 · 2 评论 -
问题解决:如何管理线程私有(thread_local)的指针变量
引言问题出现在实现项目的一个功能的时候,我需要一个thread_local的指针,因为整个项目已经差不多实现了,但在最后发现了内存泄露的问题。因为实现的是一个偏向于底层的库,且内存的使用基本都在掌握之内,所以在项目实现之初为了效率并没有使用智能指针,但在后来在这里出现了内存泄露问题。原本代码差不多是这样:__thread Co_Rountinue_Env* CurrentThread_CoEnv = nullptr;这样在线程结束以后很难去把它释放掉,所以需要想一个方法做到这样,且不想大规模改动原原创 2020-07-02 15:41:05 · 912 阅读 · 0 评论 -
thread_local与__thread的区别
gcc版本为(gcc version 7.3.0 (Debian 7.3.0-19))引言两个关键字都是关于线程存储的,不过一个是C语言的,一个是C++11的特性。它们之间有什么区别呢?因为在CSDN没有找到解答,遂在解答中对过程进行记录,以帮助有同样疑惑的同学。过程__thread is supported on GNU, clang and more. It was available before thread_local… they are not equivalent and both原创 2020-06-08 23:29:27 · 6077 阅读 · 5 评论 -
为什么C++20中要移除std::alloctor的construct与destory
引言第一次遇到这个问题是一次偶然的机会在cpp官网上查std::alloctor时发现的,顿时感到十分疑惑,毕竟前脚刚写了这个东西的好处,后脚就发现人家标准移除了,这不禁让人更加疑惑且好奇,为什么要去掉呢,先分配内存,然后构造,然后析构不是很正常的流程呢,带着这个疑问,逛遍了各大论坛,博客,最后终于在stackoverflow上得到了解答,遂进行记录,对有同样疑问的朋友给出一个思考的方向...原创 2020-02-09 23:58:46 · 2071 阅读 · 0 评论 -
Observer之谬何在?
引言原创 2020-02-09 22:13:32 · 320 阅读 · 2 评论 -
ptr_vector与vector+unique_ptr 区别
引言原创 2020-02-07 23:27:48 · 1907 阅读 · 0 评论 -
使用std::nested_exception
引言原创 2020-02-07 17:58:23 · 1663 阅读 · 0 评论 -
C++如何使指针指向泛型的对象
引言这是一次在代码中遇到的一个小问题,在网上没有找到解答,遂在解决后分享出来,帮助有同样问题的朋友直入主题 我们来看一段简单的代码来引入我们的问题 template<typename Type> struct wrapper_type{ Type fun; ... };首先这是一个简单泛型对象的声明,假如现在有一个需求,就...原创 2020-01-29 20:48:57 · 987 阅读 · 0 评论 -
为什么我们要使用std::alloctor
std::allocator is used when you want to separate allocation and do construction in two steps. It is also used when separate destruction and deallocation is done in two steps. All the STL containers in...原创 2020-01-23 20:01:57 · 541 阅读 · 0 评论 -
问题解决: invalid static_cast from type 'unresolved overloaded function type' to type 'xxx'
引言在编写一个多线程的代码时遇到这个问题,在csdn,博客园查询无果后在stackoverflow上得到了解答,遂在解答后分享出来,希望能帮到有同样问题的朋友.问题复现问题解决: invalid static_cast from type ‘unresolved overloaded function type’ to type ‘xxx’...原创 2020-01-22 23:24:44 · 4833 阅读 · 0 评论 -
std::future如何实现
引言C++11中引入了一个异步编程的利器std::future(虽然javaGDK5中就已经引入了),这显然使我们的异步编程的过程变得即简介又易维护,但学习不能仅停留在知道它是干什么的的阶段,显然正确的使用时机也是我们需要学习的,但是总感觉对其使用有点不得心应手,遂决定简单的看看源码,看看其是如何实现的.猜测在看源码之前 首先自己想一想这个过程当然也是极好的 那我们一起来捋一捋吧 其实过程想...原创 2020-01-20 21:19:03 · 2353 阅读 · 1 评论 -
std::string源码剖析(1) 体系结构
引言一直以来广大C++使用者对标准库中std::string褒贬不一,笔者整理了一下,大致是以下几点不支持一些常用功能,例如format有algorithm的情况下.basic_string支持的功能太多,过于冗余,缺少编码信息,对于宽字节等有其它的容器,比如wstring,u16string,u32string.不少地方效率不够比起字符串更应该叫字节串,它并不像其他语言一样只读的(...原创 2020-01-18 23:36:29 · 950 阅读 · 0 评论 -
C++迭代器后置++与前置++有什么区别
引言在看到代码后感觉确实以前只是知道为什么 有点人云亦云的感觉 而没有眼见为实过 遂记录这篇博客 解决有同等需求的朋友Talk is cheap, show your std code. __normal_iterator&//前置 operator++() _GLIBCXX_NOEXCEPT //noexcept { ++_M_current;/...原创 2020-01-03 22:00:21 · 1328 阅读 · 0 评论 -
std::__are_same 简单解释
引言在std::string中发现了这个函数,但当时并没有找到这个函数的具体意义,虽然能猜个大概,但始终不算解决 遂在解决后记录 以帮助其他有相同问题的朋友cpp_type_traits.h00115 // Compare for equality of types.00116 template<typename, typename>00117 struct ...原创 2020-01-03 21:54:04 · 333 阅读 · 0 评论 -
string_view.copy
下面是官网的解释size_type copy( CharT dest, size_type count, size_type pos = 0 ) const;(since C++17)(until C++20)constexpr size_type copy( CharT dest, size_type count,size_type pos = 0 ) const;(since C+...原创 2019-12-16 18:06:17 · 448 阅读 · 0 评论 -
std::string reserve详解
详解当然是从源码入手了.我们先来看看string的reserve的源码 template<typename _CharT, typename _Traits, typename _Alloc> void basic_string<_CharT, _Traits, _Alloc>:: reserve(size_type __res) {...原创 2019-12-14 23:08:29 · 2571 阅读 · 0 评论 -
什么是_GLIBCXX_CONSTEXPR
这其实是c++config.h中为constexper定义的一套宏 在C++11以后的版本支持 根据本机支持C++的C++版本不同进行不同的替换 但现在各个版本都相同下面是源码部分#if __cplusplus// Macro for constexpr, to support in mixed 03/0x mode.#ifndef _GLIBCXX_CONSTEXPR# if __c...原创 2019-12-12 23:16:41 · 1286 阅读 · 0 评论 -
为什么operator new的第一个参数必须是size_t
asd原创 2019-12-04 21:36:12 · 3655 阅读 · 0 评论 -
Linux兴趣小组15,17,18年纳新题总结
在完成三年的纳新题后 深深的感到学长们对这一张张试卷中注入的心血 让我们受益良多 接下来对这三年的一些题目进行总结。2015年纳新题目总结:第五题:请解释什么是预处理,何时需要进行预处理?为什么要进行C语言的预处理 因为在写代码时我们经常会有注释 宏定义等而且为了愉快的完成我们的代码工作 各种各样的函数也是必不可少的,所以我们要进行预处理,去用代码取代include 删除注释 替换def...原创 2019-05-20 11:43:03 · 425 阅读 · 1 评论 -
initializer_list模板的作用
提要模板initializer_list是C++11中新增的,用于可让我们列表初始化容器,自定义的函数,自定义的类中的构造函数,要在代码中使用initializer_list必须包含头文件initializer_list,这个模板很简单,包含成员函数 begin(),end(),size(),可以使用这些函数去遍历列表元素。首先我们来看一个简单的代码: cout << "s...原创 2019-05-09 17:38:12 · 3068 阅读 · 0 评论 -
C++ Primer Plus(第六版)第十四章课后编程题加讲解
第一题第一题与第二题其实都是一个has-a 关系的温习 无非第一题是包含 第二题是私有继承 第一题比较简单 没有什么说的PS:值得注意的是如果代码重出现了比较繁琐的模板类 我们最好能使用typedef去简化wine.h//pair类的创建#ifndef WINE_H_#define WINE_H_ #include<string>#include<iostream...原创 2019-05-03 16:15:22 · 573 阅读 · 1 评论 -
关于C++引用变量的总结
引用变量是c++中新增的一种符合类型,引用是已定义的变量的别名,也就是说其实它们的地址是一样的,它的作用主要是作为函数的形参,特别是较大的结构体时使用,可以去提高效率,原因在下文中会解释。引用的声明这是引用的声明方式和指针的声明方式:int f1 = 5;int & f2 = f1;int p1 = 5;int * p2 = &p1;首先引用变量的声明和指针很类似,...原创 2019-03-31 23:56:33 · 333 阅读 · 0 评论 -
如何使得关联容器对结构体有效
其实在最开始遇到这个问题实在做一道搜索类型的题目时 想实现的是利用结构体进行剪枝但发现map并不能够使用 当时没有继续深挖这个问题 随着对C++的学习 今天得到了解答 遂写一篇博客。我们可以去想使用关联容器时内部是如何对其进行比较的呢 map的内部实现是红黑树(我太菜了 还没有学红黑树。。) 但就目前学的来说二叉平衡树的实现比较运算符只需要一个<号就可以实现 我们自定义的结构体没有比较...原创 2019-07-21 18:38:30 · 208 阅读 · 0 评论 -
C++智能指针如何指向数组
引子智能指针在帮助C++程序员管理动态内存方面可谓神兵利器,但是在有些情况下我们想要对数组进行动态内存管理就会发现一个问题 咦?shared_ptr 在默认情况下是不能指向数组的,那是为什么呢。原因是因为我们的 shared_ptr 默认的删除器是使用 Delete 对智能指针中的对象进行删除,而 delete 要求 new 时是单一指针 Delete时也应该是指针 new时是数组 delet...原创 2019-07-28 19:22:14 · 16145 阅读 · 3 评论 -
C++中成员函数如何作为回调函数
引言C++中成员函数在一般情况下是无法作为回调函数的 原因就是因为一般的成员函数在传参时为了可以访问成员变量或者返回本身 会默认的传一个 this 指针 但是回调函数再触发时会返回参数 这就会导致在把成员函数作为回调函数的时候会报参数错误这样一种奇怪的错误 那么如何去避免这种情况呢 本文针对此种情况介绍两种方法一.类内静态成员函数作为回调函数我们报错的原因是因为成员函数会隐式的传一个 thi...原创 2019-08-24 17:08:11 · 790 阅读 · 0 评论 -
C++右值与右值引用
引言C++11中最重要的特性之一就是移动,这在大多数情况下可以大幅度的提升程序的性能,其实也不难理解,举个简单的例子,vector中当容量到达提前分配的最大值时会进行重新分配内存,那对于所有原本vector中所有的元素来说,要重新拷贝一份到新的分配的内存空间,那如果vector中提前数据较大,拷贝加析构旧的数据,那是多大的内存开销啊。在C++11之前确实需要这样,但在移动这个新特性出现以后,一切...原创 2019-08-26 16:58:04 · 680 阅读 · 0 评论 -
移动复制构造函数与移动赋值构造函数
引言对象移动是C++11中一个重要的特性,在C++的以前版本,在很多地方在逻辑上并不需要拷贝,但实则必须拷贝,比如说vector的分配空间,所以在合适的情况下使用对象移动会使程序性能大幅度提升,下面就来简单的介绍下移动构造函数与std::move函数浅复制与深复制问题说起移动构造函数就不得不提起拷贝构造函数中的浅复制与深复制问题,这在C++ Primer Plus 与 C++ Primer中...原创 2019-08-26 18:26:19 · 784 阅读 · 0 评论 -
简单实现shared_ptr
引言原创 2019-09-02 23:22:20 · 519 阅读 · 5 评论 -
‘A’ is an inaccessible base of ‘B’解决方案
引言最近在写代码时突然遇到这个问题 且CSDN上没有找到解答 遂在解决问题后发布一篇博客记录 同时帮助有同样问题的朋友首先来看一段代码namespace NS{ class Quote{ }; void display(const Quote&){cout << "Linux\n";}}class Bulk : NS::Quote{};...原创 2019-09-20 10:53:24 · 6448 阅读 · 3 评论 -
C++中cin对象关于错误的处理
在C++中 iostream类中的cin对象是 “智能” 的,意味着它可以根据变量的类型自动限制输入 ,当我们输入的数据为相对类型或者可以根据C++标准自动转换为需要的变量类型(int转换为double)并不会发生什么,但当输入的数据没有办法进行转换时(char无法转换为int),cin对象不但会拒绝以后的数据,而且本次输入由于输入类型错误也不会存到我们需要的变量中。防止这种情况发生的措施是使用...原创 2019-05-15 17:09:18 · 1097 阅读 · 0 评论