C-C++基础与进阶
文章平均质量分 80
zhangyifei216
这个作者很懒,什么都没留下…
展开
-
Tip of the Week #74: Delegating and Inheriting Constructors
Tip of the Week #74: Delegating and Inheriting ConstructorsOriginally posted as totw/74 on 2014-04-21By Bradley White (bww@google.com)“Delegating work works, provided the one delegating works, too...翻译 2019-03-07 10:50:01 · 458 阅读 · 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 · 1317 阅读 · 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 · 1672 阅读 · 1 评论 -
Item40 Use std::atomic for concurrency, volatile for specific memory
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 volatile关键字在C++中很少被使用,更准确来说是很少被正确使用,它的用途令人很迷惑,甚至这个关键字都不会出现在并发章节。因为这个关键字对于并发编程来说没有任何用处,但是在其他编程语言中这个关键字的用途却很大,因此很值原创 2017-05-05 22:47:59 · 1928 阅读 · 0 评论 -
Item39 Consider void futures for one-shot event communication
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 有的时候对于一个任务来说,希望有一种机制可以和另外一个任务进行通信,尤其是那种异步运行的任务,并且会出现一种特定事件的任务,另外一个任务需要等到这个事件的发生才能继续运行,典型的,可以是等待一个重要的数据结构进行初始化,或者是等待原创 2017-04-30 20:31:53 · 1684 阅读 · 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 · 1271 阅读 · 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 · 1243 阅读 · 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 · 1094 阅读 · 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 · 1791 阅读 · 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 · 842 阅读 · 0 评论 -
Item32 Use Init capture to move objects into closures
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 一些时候Lambda的值拷贝和引用两张捕获模式都没有办法满足你的需要,比如当你有一个可移动的对象,你希望可以将这个对象移动到闭包中,因为值拷贝的效率不高,引用捕获的话会导致生命周期的问题。很可惜C++11并没有提供将对象移动到闭包原创 2017-02-12 14:34:12 · 998 阅读 · 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 · 1062 阅读 · 0 评论 -
Item30 Familiarize yourself with perfect forwarding failure cases
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 在C++11中最为显著的一个新特性,当属完美转发了,是的它很完美,和它的名字一样,转发两字意味着一个函数将其参数传递给另外一个函数,第二个函数的目标则是接收来自于第一个函数传递过来的对象,转发二字体现出第二个函数接收到的对象应该和原创 2017-02-06 21:57:01 · 1149 阅读 · 0 评论 -
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 · 841 阅读 · 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 · 1472 阅读 · 0 评论 -
Item24 Distinguish universal references from rvalues reference
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 刚接触C++11的移动语义的时候,认为T&&就是右值引用,在随后阅读文献的时候发现了另外一个名字,通用引用(universal references),起初认为这两者是同一个东西,直到今天才知道两者不是一个东西,只是形式上相同而已原创 2016-12-14 22:15:24 · 963 阅读 · 0 评论 -
Effective Modern C++笔记汇总
Effective Modern C++ 目录Item 1: Understand template type deduction….待续原创 2017-06-05 16:09:58 · 12379 阅读 · 4 评论 -
C++惯用法之SFINAE
SFINAE惯用法是什么?在谈SFINAE之前我们先来看一段代码,一切从这段代码开始。template <typename T>void show(typename T::iterator x, typename T::iterator y){ for (; x != y; ++x) cout << *x << endl;}int main(){ show<int>(16,原创 2016-06-21 20:17:10 · 2760 阅读 · 1 评论 -
Envoy源码分析之ThreadLocal
ThreadLocal整体结构Envoy中严重依赖ThreadLocal,为了避免加锁Envoy会尽可能在单一线程中完成所有的事件,但是多个线程之间难免会有一些数据需要共享,还有可能需要读写,为了避免加锁Envoy将一些需要在线程之间共享的数据放在ThreadLocal中,当ThreadLocal中的数据需要更新的时候则会通过主线程将更新后的数据Post到各个线程中,交由各个线程来更新自己的Th...原创 2019-02-01 09:45:23 · 1290 阅读 · 0 评论 -
Tip of the Week #65: Putting Things in their Place
Tip of the Week #65: Putting Things in their PlaceOriginally posted as totw/65 on 2013-12-12By Hyrum Wright (hyrum@hyrumwright.org)“Let me ’splain. No, there is too much. Let me sum up.” –Inigo Mo...翻译 2018-10-21 21:29:55 · 344 阅读 · 0 评论 -
Tip of the Week #64: Raw String Literals
Tip of the Week #64: Raw String LiteralsOriginally published as totw/64 on 2013-12-09By Titus Winters (titus@google.com)Updated 2017-10-23Quicklink: abseil.io/tips/64“(?:”(?:\\"|["])*"|’(?:\\’|[...翻译 2018-10-21 16:20:38 · 315 阅读 · 0 评论 -
Tip of the Week #61: Default Member Initializers
Tip of the Week #61: Default Member InitializersOriginally posted as Totw #61 on Nov 12, 2013by Michael Chastain (mec.desktop@gmail.com)Updated October, 2016Declaring Default Member Initializati...翻译 2018-10-21 15:47:33 · 296 阅读 · 0 评论 -
Tip of the Week #59: Joining Tuples
Tip of the Week #59: Joining TuplesOriginally published as totw/59 on 2013-10-21By Greg Miller (jgm@google.com)Updated 2018-01-24“Now join your hands, and with your hands your hearts.” –Henry VI,...翻译 2018-10-21 15:14:40 · 316 阅读 · 0 评论 -
Tip of the Week #55: Name Counting and unique_ptr
Tip of the Week #55: Name Counting and unique_ptrOriginally published as totw/55 on 2013-09-12by Titus Winters (titus@google.com)Updated 2017-10-20Quicklink: abseil.io/tips/55“Though we may know...翻译 2018-10-21 14:23:56 · 268 阅读 · 0 评论 -
Tip of the Week #49: Argument-Dependent Lookup
Tip of the Week #49: Argument-Dependent LookupOriginally posted as totw/49 on 2013-07-14“…whatever disappearing trail of its legalistic argle-bargle one chooses to follow…” –Antonin Scalia, U.S. v ...翻译 2018-10-21 10:11:14 · 350 阅读 · 0 评论 -
Tip of the Week #24: Copies, Abbrv
Tip of the Week #24: Copies, AbbrvOriginally posted as TotW #24 on Nov 26, 2012by Titus Winters, (titus@google.com) and Chandler Carruth (chandlerc@google.com)“To copy others is necessary, but to ...翻译 2018-10-19 16:12:16 · 346 阅读 · 0 评论 -
Item37 Make std::threads unjoinable on all paths
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 每一个std::thread对象都有两种状态,一个是joinable状态,另外一个则是unjoinable状态。状态是joinable状态的std::thread对象其底层对应的是可以运行的线程。这个线程可以是阻塞的或者是等原创 2017-04-15 21:31:15 · 1418 阅读 · 0 评论 -
Tip of the Week #11: Return Policy
Tip of the Week #11: Return Policy Originally posted as TotW #11 on August 16, 2012 by Paul S. R. Chisholm (p.s.r.chisholm@google.com) Frodo: There’ll be none left for the return journey. Sa...翻译 2018-07-01 15:18:12 · 530 阅读 · 0 评论 -
Tip of the Week #42: Prefer Factory Functions to Initializer Methods
Tip of the Week #42: Prefer Factory Functions to Initializer Methods Originally posted as totw/42 on 2013-05-10 By Geoffrey Romer (gromer@google.com) Revised 2017-12-21 “The man who build...翻译 2018-04-02 22:02:07 · 407 阅读 · 1 评论 -
Tip of the Week #36: New Join API
Tip of the Week #36: New Join API Originally published as totw/36 on 2013-03-21 By Greg Miller (jgm@google.com) Updated 2018-01-24 “I got a good mind to join a club and beat you over the ...翻译 2018-04-02 22:01:17 · 416 阅读 · 0 评论 -
Tip of the Week #10: Splitting Strings, not Hairs
Tip of the Week #10: Splitting Strings, not Hairs Originally published as totw/10 on 2012-08-16 By Greg Miller (jgm@google.com) Updated 2018-01-24 I tend to have an odd split in my mind. ...翻译 2018-04-02 22:00:19 · 407 阅读 · 0 评论 -
Tip of the Week #3: String Concatenation and operator+ vs. StrCat()
Tip of the Week #3: String Concatenation and operator+ vs. StrCat() Originally published as totw/3 on 2012-05-11 Updated 2017-09-18; revised 2018-01-22当一个reviewer说”不要使用string的连接操作,这不高效”,通常会让...翻译 2018-04-02 21:58:57 · 458 阅读 · 0 评论 -
Tip of the Week #1: string_view
Tip of the Week #1: string_view Originally published as totw/1 on 2012-04-20 By Michael Chastain (mec.desktop@gmail.com) Updated 2017-09-18What’s a string_view, and Why Should You Care?当我们创建一个翻译 2018-04-02 21:48:34 · 648 阅读 · 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 · 1312 阅读 · 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 · 1098 阅读 · 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 · 1276 阅读 · 0 评论 -
Item4 Know how to view deduced types
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。在Item3中学习了C++11新特性decltype,decltype可以获取变量或者表达式的类型,但是获取到的类型只能用于定义其他的变量和类型,不能打印出来,也不能用来操作。毕竟是编译期实现,用来做类型反射就算了,那么至少也应该可以打印原创 2016-09-25 12:55:38 · 1189 阅读 · 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 · 1017 阅读 · 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 · 1524 阅读 · 0 评论 -
C++11 chrono入门
C++11引入chrono类来表示时间中的一些概念,以及进行时间相关的计算,这是因为传统使用算术的方式来表示时间间隔和时间点本身这是很模凌两可的。通过使用chrono类库,使用不同的类型来表示不同的时间概念,这有助于通过编译器在编译时来帮助程序员发现一些逻辑错误,为此chrono抽象了如下几个概念:duration 一个时间的duration表示的就是一个时间间隔,比如:3秒、3分钟、原创 2017-06-17 20:54:18 · 2377 阅读 · 0 评论