Item16 Make const member functions thread safe

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 ​ const(可以用constexpr替换见Item15)成员函数和线程安全是本文的一个核心主题,两者究竟是如何联系在一起的呢?这一切都源于mutable,本文试图从以下几个方面介绍。 是什么导致const成员函数变成了非线程安全...
阅读(724) 评论(0)

Item15 Use constexpr whenever possible

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 ​ 如果有人问在C++11引入的众多关键字中,有哪个关键字是最让你迷惑的,我会立马回答是constexpr,当这个关键字应用到对象上的时候,它其实就是一个加强版的const,但是当它应用到函数身上,它就有了不同的含义。为此很有必要去深...
阅读(484) 评论(0)

世界上最简单的无锁Hash Table

​ 一个无锁的hash table是把双刃剑,它可以为某些应用程序提供性能上的大幅提升,它的缺点就是过于复杂了。Dr. Cliff Click使用Java写了第一个可工作的无锁hash table,并在2007年的时候公布其源码,并且在同一年在Google发表了演讲。原理分析​ 本文将通过使用C++11来编写一个无锁的hash table,作为一个程序员我们通常会贫直觉去写一些通用的数据结构...
阅读(562) 评论(0)

Item14 Declare functions noexcept if they won't emit exception

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 ​ 在C++98中异常规格说明是一个废弃的,没有人用的特性,因为它需要知道一个函数可能会抛出的异常类型,如果函数后面有改动,那么异常规格说明也有可能需要改动。与此同时调用这个函数的代码也有可能需要发生相应的改变。最要命的是编译器并不负...
阅读(309) 评论(0)

2016年规划

要读的书 c++ concurrency in action Effective Modern C++ go学习笔记 go in practice preshing的博客 MIT6.824的课程 要做的事情 写自己的key/value分布式存储 对C++并发编程和内存模型有深刻认识 工作落实 论文实验完成 已经完成的事情 工作落实...
阅读(309) 评论(0)

Item13 Prefer const_iterators to iterators

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

并发数据结构Leapfrog Probing

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

Item12 Declare overriding function override

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

Item11 Prefer deleted functions to private undefined ones

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

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

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

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...
阅读(1246) 评论(0)

Item10 Prefer scoped enums to unscoped enums

这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 通常来说我们在花括号中定义的名称其作用域就在花括号中,但是C++98的枚举类型的声明缺不遵从这个规则。enum Color {black,white,red}; auto white = false; //编译出错white已经声明了...
阅读(231) 评论(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...
阅读(404) 评论(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...
阅读(444) 评论(0)
    个人资料
    • 访问:91667次
    • 积分:2025
    • 等级:
    • 排名:千里之外
    • 原创:111篇
    • 转载:0篇
    • 译文:1篇
    • 评论:23条
    博客专栏
    最新评论