生活-读书-大事记
文章平均质量分 79
zhangyifei216
这个作者很懒,什么都没留下…
展开
-
Item29 Assume that move operations are not present,not cheap,and not used
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 在C++11新增的特性中,移动语义毫无疑问是最为重要的特性,有了这个特性后,对于STL容器的移动操作变的和拷贝一个指针一样高效。它允许编译器将那么昂亏的拷贝操作替换成高效的移动操作,将你的代码重新用C++11编译一遍后,你会发现你原创 2017-01-16 22:25:18 · 815 阅读 · 0 评论 -
Item28 Understand reference collapsing
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 在Item23中详细的介绍了std::move和std::forward的实现原理,并给出了std::move一种典型实现,但是在介绍std::forward的时候,我承认我偷懒了,我只是简单的提到std::forward类似st原创 2017-01-08 22:42:34 · 1436 阅读 · 0 评论 -
Item24 Distinguish universal references from rvalues reference
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 刚接触C++11的移动语义的时候,认为T&&就是右值引用,在随后阅读文献的时候发现了另外一个名字,通用引用(universal references),起初认为这两者是同一个东西,直到今天才知道两者不是一个东西,只是形式上相同而已原创 2016-12-14 22:15:24 · 937 阅读 · 0 评论 -
Item23 Understand std::move and std::forward
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 std::move和std::forward并不像它们的名字那样有用,这两个仅仅是一个模版函数,是在C++11中引入的,辅助移动语义的,std::move并不是真正的移动了数据,而std::forward也不是真正的进行了转发。为原创 2016-12-06 00:22:09 · 1290 阅读 · 0 评论 -
Item22 When using the Pimpl, define specific member functions in the implementation file
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 Pimpl idiom这个C++的惯用法,我相信很多人都知道,通常为了保护我们的头文件,避免在修改类的数据成员的时候导致依赖这个头文件的程序也需要重新编译,常常被人们称为编译防火墙。例如下面这个类的头文件。class Widget原创 2016-11-30 21:43:29 · 1068 阅读 · 4 评论 -
Item26 Avoid overloading on universal references
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 在正式进入本文主题之前先来看一段代码,这段代码的目的是纪录下当前的日期和时间,并纪录一下名字到全局的数据结构中,代码如下:std::multiset<std::string> names;void logAndAdd(const原创 2016-12-27 22:44:49 · 1229 阅读 · 0 评论 -
Item21 Perfer std::make_unique and std::make_shared to direct use of new
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 std::make_shared是在C++11中添加的一个专门用来创建智能指针的方法,而不幸的是std::make_unique在C++11中并没有,直到C++14才引进来。不过实现它也是一件很容易的一件事,如下:template原创 2016-11-28 22:52:55 · 1036 阅读 · 0 评论 -
Item20 Use std::weak_ptr for std::shared_ptr like pointers that can dangle
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 原始指针有一个致命的问题就是无法探知生死,尽管你可以通过释放内存后设置为空来解决部分场景下存在的问题,但是这治标不治本,当有多个指针指向同一个内存资源的时候就无能无力了。那么在这篇文章中我将介绍一个大杀器std::weak_ptr原创 2016-11-23 22:37:49 · 1047 阅读 · 0 评论 -
Item19 Use std::shared_ptr for shared-ownership resource management
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 在上一篇文章中讨论了std::unique_ptr,本文讨论的则是另外一个比较重要的智能指针,std::shared_ptr,通过本文标题可知,这是一个共享所有权的智能指针,使用这个智能指针可以实现弱化的垃圾回收(Python的垃原创 2016-11-16 21:58:48 · 1362 阅读 · 0 评论 -
Item18 Use std::unique_ptr for exclusive-ownership resource management
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 在这篇文章中我主要探讨下std::unique_ptr这个智能指针,说到智能指针就需要说下它和原始指针的区别了,原始指针很灵活但是处处都是陷阱,用不好很容易出错,但是智能指针(Smart Pointer)相比于原始指针更易用,通过原创 2016-11-14 19:42:53 · 1181 阅读 · 0 评论 -
Item30 Familiarize yourself with perfect forwarding failure cases
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 在C++11中最为显著的一个新特性,当属完美转发了,是的它很完美,和它的名字一样,转发两字意味着一个函数将其参数传递给另外一个函数,第二个函数的目标则是接收来自于第一个函数传递过来的对象,转发二字体现出第二个函数接收到的对象应该和原创 2017-02-06 21:57:01 · 1120 阅读 · 0 评论 -
Item31 Avoid default capture modes
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 C++11中Lambda表达式给C++带来了很大的改变,通过Lambda可以很方便的创建一个函数对象,这对于C++的开发来说影响是巨大的,比如可以很方便的结合STL的一些算法,不用再单独创建函数来用,还有可以很好的结合std::u原创 2017-02-12 12:26:34 · 1044 阅读 · 0 评论 -
Item41 Consider pass by value for copyable parameters that are cheap to move and always copied.
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 函数的参数传递方式有很多种,可以是值拷贝、传指针、传引用、甚至是移动。下面这个addName函数就是将外部传入的值存放到其内部的一个私有的容器中,为了让传递的过程更加高效,addName同时支持引用传递和移动两种方式。class W原创 2017-05-29 20:37:30 · 1279 阅读 · 0 评论 -
Item42 Consider emplacement instead of insertion
如果你有一个容器,存放的是std::string类型,当你通过插入函数(如:insert、push_front、push_back或者是std::forward_list的insert_after)传递一个std::string类型的元素到容器中,逻辑上容器中就会有这个元素了。尽管这可能只是逻辑上的,但并不总是真的,考虑下面这段代码:std::vector<std::string> vs;原创 2017-06-05 14:27:30 · 1654 阅读 · 1 评论 -
Item40 Use std::atomic for concurrency, volatile for specific memory
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 volatile关键字在C++中很少被使用,更准确来说是很少被正确使用,它的用途令人很迷惑,甚至这个关键字都不会出现在并发章节。因为这个关键字对于并发编程来说没有任何用处,但是在其他编程语言中这个关键字的用途却很大,因此很值原创 2017-05-05 22:47:59 · 1892 阅读 · 0 评论 -
Item39 Consider void futures for one-shot event communication
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 有的时候对于一个任务来说,希望有一种机制可以和另外一个任务进行通信,尤其是那种异步运行的任务,并且会出现一种特定事件的任务,另外一个任务需要等到这个事件的发生才能继续运行,典型的,可以是等待一个重要的数据结构进行初始化,或者是等待原创 2017-04-30 20:31:53 · 1643 阅读 · 0 评论 -
Item38 Be aware of varying thread handle destructor behavior
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。在Item37中解释过一个状态为joinable的std::thread对象其底层对应一个系统线程。std::future对象和std::thread比较类似,一个future对象也对应着一个系统线程。尽管如此者两者在析构的时候其行为是不原创 2017-04-29 23:45:19 · 1233 阅读 · 0 评论 -
Item36 Specify std::launch::async if asynchronicity is essential
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 当你调用std::async执行一个函数或者是可调用对象的时候,你通常会试图让这个函数异步的执行,但是std::async并不是必须要这样做。只有通过给std::async指定运行的策略为异步的情况下函数才能确保一定是异步执行的原创 2017-03-29 17:44:16 · 1209 阅读 · 0 评论 -
Item35 Prefer task-based programming to thread-based
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 C++11第一次将并发引入到了语言和标准库中,这使得C++程序员们终于可以直接写跨平台的多线程程序了,不用再自己去写不同平台的线程封装了。C++11在引入线程相关的API的同时也引入了一些并发编程的高级组件例如tasks、fut原创 2017-03-29 12:08:23 · 1067 阅读 · 0 评论 -
Item34 Prefer lambdas to std::bind
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 C++11中的std::bind是对C++98中的std::bind1st 和std::bind2nd的改进和继承。而std::bind是在2005年的时候 作为标准库的一部分,起初是放在TR1规范中,拥有自己独立的命名空间st原创 2017-03-27 19:49:15 · 1726 阅读 · 0 评论 -
Item33 Use decltype on auto&& parameters to std::forward them
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 在C++14中最令人激动的特性当属通用lambda了,通用lambda指的就是使用auto来作为lambda的参数。实现通用lambda也是很方便的,我们知道lambda本质上是一个仿函数,也就是实现了operator()操作原创 2017-03-27 13:41:57 · 825 阅读 · 0 评论 -
Item32 Use Init capture to move objects into closures
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 一些时候Lambda的值拷贝和引用两张捕获模式都没有办法满足你的需要,比如当你有一个可移动的对象,你希望可以将这个对象移动到闭包中,因为值拷贝的效率不高,引用捕获的话会导致生命周期的问题。很可惜C++11并没有提供将对象移动到闭包原创 2017-02-12 14:34:12 · 951 阅读 · 0 评论 -
Item25 Use std::move on rvalue reference, std::forward on universal references
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 右值引用只能绑定到那些可以移动的对象上,如果你有一个右值引用的参数,你应该知道这个参数是用来接收可以移动的对象的。而一个通用引用既可以绑定到一个右值,也可以绑定到一个左值。然后std::forward则可以根据传入的值的类型进行有原创 2016-12-27 19:44:28 · 1371 阅读 · 1 评论 -
Item17 Understand special member function generation
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 Effective C++中曾经提到了Rule of Three 意思就是如果你需要声明拷贝构造函数,拷贝赋值操作符和析构函数三者中的任何一个(原因参见),那么你应该三者都声明,Inside the C++ Object Mode原创 2016-11-09 20:21:41 · 1230 阅读 · 0 评论 -
Item4 Know how to view deduced types
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。在Item3中学习了C++11新特性decltype,decltype可以获取变量或者表达式的类型,但是获取到的类型只能用于定义其他的变量和类型,不能打印出来,也不能用来操作。毕竟是编译期实现,用来做类型反射就算了,那么至少也应该可以打印原创 2016-09-25 12:55:38 · 1159 阅读 · 0 评论 -
Item6 Use the explicitly typed initializer idiom when auto deduces undesied types
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。在Item5中提到了使用auto所带来的诸多优点,在Item2中提到了auto的类型推导规则和模板类型推导基本一致,推导出来的类型有的时候并不是我们所想要的类型(会忽略CV限制符和引用),那么本文继续探究auto的其它缺点。std::ve原创 2016-09-27 22:00:27 · 992 阅读 · 0 评论 -
Item2 Understand auto type deduction
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。在Item1中介绍了C++98的模板类型推导,C++11中引入的auto其类型推到规则和模板类型推到如出一辙。在Item1中提到,模板类型推导规则可以总结为如下形式:template<typename T>void f(`参数类型` p原创 2016-09-22 22:42:40 · 1500 阅读 · 0 评论 -
Item1 Understand template type deduction
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。C++的模板对于类型推导来说,在通常情况推导出的类型和我们期望的是一致的,然而事情并不是总是这样如此美妙。例如下面这个例子:template<typename T>void f(参数类型 parm);参数类型可以是下面几种情况: 1.原创 2016-08-25 20:39:29 · 3304 阅读 · 2 评论 -
信息的表示与处理
2017年4月趁着临近毕业时间比较充裕,就买了一本深入理解计算机系统(第三版),这本书的第二版之前浅浅的读过一遍只对里面的编译与链接章节印象深刻,其他章节对我来说完全陌生,我深知这本书的好,于是重新拾起这本书。为了加深自己的记忆就开始写博客记录自己的读书笔记。第二章 信息的表示与处理如果值x是2的n次幂就可以很轻松的通过下面这个公式直接转换为十六进制。n = i + 4j 其中i在[0,3]范原创 2017-04-16 22:01:32 · 606 阅读 · 0 评论 -
程序的机器级表示
2017年4月趁着临近毕业时间比较充裕,就买了一本深入理解计算机系统(第三版),这本书的第二版之前浅浅的读过一遍只对里面的编译与链接章节印象深刻,其他章节对我来说完全陌生,我深知这本书的好,于是重新拾起这本书。为了加深自己的记忆就开始写博客记录自己的读书笔记。第三章 程序的机器级表示gcc4.8 引入-Og选项,使得生成的代码更符合原始程序的结构。传送类指令的两个操作数不能指向内存位置。任何原创 2017-04-29 09:25:40 · 1477 阅读 · 0 评论 -
计算机系统漫游
2017年4月趁着临近毕业时间比较充裕,就买了一本深入理解计算机系统(第三版),这本书的第二版之前浅浅的读过一遍只对里面的编译与链接章节印象深刻,其他章节对我来说完全陌生,我深知这本书的好,于是重新拾起这本书。为了加深自己的记忆就开始写博客记录自己的读书笔记。第一章: 计算机系统漫游信息就是位+上下文,相同的二进制位在不同的上下文有着不同的含义Amdahl定律(阿姆达尔定律),其主要思想是当我原创 2017-04-10 16:22:31 · 778 阅读 · 0 评论 -
2016年规划
要读的书c++ concurrency in actionEffective Modern C++go学习笔记go in practicepreshing的博客MIT6.824的课程要做的事情写自己的key/value分布式存储对C++并发编程和内存模型有深刻认识工作落实论文实验完成已经完成的事情工作落实原创 2016-10-18 18:00:24 · 569 阅读 · 0 评论 -
2016年想读的几本书
这是一本不单单介绍C++11的语法,更是一本谈论工程级应用实现的书籍,教你如何去利用C++11的一些新特性来封装工程级应用,我想读这本书的原因主要在于想学习如何使用C++来封装一些工程级的类,谈论C++11新特性的书籍很多,但是却鲜有书籍将C++11的一些新特性应用到工程代码中. 想读这本书的理由有两点,一点是云计算场景,另一个则是通过这本书我可以把自己学习的内核理论知识运用起来.我是一个学习内核原创 2016-01-05 12:04:08 · 661 阅读 · 0 评论 -
<<Effective TCP/IP Programming>>读书笔记
技巧1 理解基于连接和无连接协议之间的差异TCP/IP分为四层,分别是接口层/物理层/链路层-->传输层-->网络层-->应用层传输层主要就是IP层,该层提供了一个很好的高效的,不可靠的,无连接的服务,负责接收来自上层的数据包,然后封装到一个IP数据包中,并路由该数据包到正确的硬件接口上。TCP在IP层上增加了三个服务,以用来实现TCP的可靠的面向连接的服务:1.为TCP段提供了校验位,这就原创 2016-02-20 20:41:37 · 1274 阅读 · 0 评论 -
Item7 Distinguish between () and {} when creating objects
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。在引入C++11后变量的初始化方式多种多样,对于每种初始化的方式的区别和联系是一个让我很迷惑地方 int x(0); int y = 0; int z{0}; int c = {0};c++通常把c = {0}这种初始化方式原创 2016-09-30 09:18:01 · 1162 阅读 · 0 评论 -
Item5 Prefer auto to explicit type declarations
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。写C/C++的程序员都知道定义一个变量如果没有给初值会导致这个变量的值是未定义的,这往往是bug的源泉,在使用容器的迭代器的时候,需要定义一个迭代器变量这个变量的类型很冗长,如下的代码应该经常可以碰到。vector<int>::itera原创 2016-09-26 21:23:15 · 1046 阅读 · 0 评论 -
Item16 Make const member functions thread safe
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 const(可以用constexpr替换见Item15)成员函数和线程安全是本文的一个核心主题,两者究竟是如何联系在一起的呢?这一切都源于mutable,本文试图从以下几个方面介绍。是什么导致const成员函数变成了非线程安全原创 2016-10-24 12:45:33 · 1415 阅读 · 0 评论 -
Item15 Use constexpr whenever possible
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 如果有人问在C++11引入的众多关键字中,有哪个关键字是最让你迷惑的,我会立马回答是constexpr,当这个关键字应用到对象上的时候,它其实就是一个加强版的const,但是当它应用到函数身上,它就有了不同的含义。为此很有必要去深原创 2016-10-23 16:11:52 · 1541 阅读 · 0 评论 -
Item14 Declare functions noexcept if they won't emit exception
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 在C++98中异常规格说明是一个废弃的,没有人用的特性,因为它需要知道一个函数可能会抛出的异常类型,如果函数后面有改动,那么异常规格说明也有可能需要改动。与此同时调用这个函数的代码也有可能需要发生相应的改变。最要命的是编译器并不负原创 2016-10-18 22:26:44 · 960 阅读 · 0 评论 -
Item13 Prefer const_iterators to iterators
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 const_iterator 是STL提供的一个等同于const指针的东西,并且它所指向的值是不可变的。标准实践中,当你需要迭代器并且不需要更改迭代器指向的值的时候,你应该使用const_iterator,无论是在C++98,还是原创 2016-10-16 22:52:03 · 918 阅读 · 0 评论