Item13 Prefer const_iterators to iterators

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 ​ const_iterator 是STL提供的一个等同于const指针的东西,并且它所指向的值是不可变的。标准实践中,当你需要迭代器并且不需要更改迭代器指向的值的时候,你应该使用const_iterator,无论是在C++98,还是...
阅读(312) 评论(0)

并发数据结构Leapfrog Probing

Leapfrog Probing一个hash table是用来存取一系列key/value对,有很多方式用来实现一个hash table。但是都有一个共同点就是桶,每一个hash table都会包含一系列的桶,对于每一个key来说都会唯一的属于一个桶。为了决定某个key是属于哪个桶,你需要对这个key进行hash,然后对它取模,其余数就是这个key所属于的桶下标,整个过程如下图:不可避免的,最终会有...
阅读(531) 评论(0)

Item12 Declare overriding function override

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 在C++面向对象的世界里面主要是围绕着类,继承和虚函数,而在这个世界里面虚函数的实现就是靠派生类重写基类的虚函数,但是这很容易出错, 这是符合墨菲定律的。因为重写听起来像重载,然而这两个其实是不相关的。class Base { pub...
阅读(487) 评论(0)

Item11 Prefer deleted functions to private undefined ones

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 如果你把你的代码提供给其他开发者,但是却不想让其他人调用某些函数,这个时候你只需要不声明这个函数就可以了,但是有的时候你拿到了这个函数声明,但是却又不能让其被调用这就不好办了。典型的比如说赋值成员函数,默认构造成员函数等。这个时候通用的做...
阅读(437) 评论(0)

使用QSBR进行安全的内存回收

使用QSBR进行安全的内存回收在多线程场景下,经常我们需要并发访问一个数据结构,为了保证线程安全我们会考虑使用互斥设施来进行同步,更进一步我们会根据对这个数据结构的读写比例而选用读写锁进行优化。但是读写锁不是唯一的方式,我们可以借助于COW技术来做到写操作不需要加锁,也就是在读的时候正常读,写的时候,先加锁拷贝一份,然后进行写,写完就原子的更新回去,使用COW实现避免了频繁加读写锁本身的性能开销。读...
阅读(345) 评论(0)

Chromium base库介绍

AtExitManager 类似于linux下的atexit,注册退出清理函数,不过base库的实现机制是利用了C++的RAII。void exit_first(void *data) { LOG(INFO) << "first"; }void exit_last(void *data) { LOG(INFO) << "second"; }void exit_task(void *data) { L...
阅读(737) 评论(0)

Item10 Prefer scoped enums to unscoped enums

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 通常来说我们在花括号中定义的名称其作用域就在花括号中,但是C++98的枚举类型的声明缺不遵从这个规则。enum Color {black,white,red}; auto white = false; //编译出错white已经声明了...
阅读(197) 评论(0)

Item9 Prefer alias declarations to typedefs

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 C++11中引入的std::unique_ptr智能指针是个好用的东西,在我们使用unique_ptr的时候往往会写出这样的类型std::uniqeu_ptr<std::unordered_map<std::string,std::str...
阅读(354) 评论(0)

Item8 Prefer nullptr to 0 and NULL

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 0是int类型,并不是指针类型,但是当0赋值给一个指针类型的时候,0将会被解释成空指针,在C++98中关键字NULL其本质就是一个long int类型的数值0,在实际使用过程中这带来了很多模棱两可的问题。void f(int); void...
阅读(375) 评论(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}这种初始化方式...
阅读(243) 评论(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...
阅读(267) 评论(0)

Item5 Prefer auto to explicit type declarations

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 写C/C++的程序员都知道定义一个变量如果没有给初值会导致这个变量的值是未定义的,这往往是bug的源泉,在使用容器的迭代器的时候,需要定义一个迭代器变量这个变量的类型很冗长,如下的代码应该经常可以碰到。vector::itera...
阅读(239) 评论(0)

Item4 Know how to view deduced types

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 在Item3中学习了C++11新特性decltype,decltype可以获取变量或者表达式的类型,但是获取到的类型只能用于定义其他的变量和类型,不能打印出来,也不能用来操作。毕竟是编译期实现,用来做类型反射就算了,那么至少也应该可以打印...
阅读(270) 评论(0)

Item3 Understand decltype

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 decltype用于用来推导变量的类型,但是不像auto和模板类型推导那样,存在很多类型推导规则,decltype推导出来的类型和变量原来的类型一模一样,没有做任何改动。在C++11中decltype结合auto还可以完成函数返回值的类型...
阅读(397) 评论(0)

Item2 Understand auto type deduction

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 在Item1中介绍了C++98的模板类型推导,C++11中引入的auto其类型推到规则和模板类型推到如出一辙。在Item1中提到,模板类型推导规则可以总结为如下形式:template void f(`参数类型` p...
阅读(352) 评论(0)
112条 共8页首页 上一页 1 2 3 4 5 ... 下一页 尾页
    个人资料
    • 访问:77483次
    • 积分:1867
    • 等级:
    • 排名:千里之外
    • 原创:110篇
    • 转载:0篇
    • 译文:1篇
    • 评论:21条
    博客专栏
    最新评论