浅析 shared_ptr:Boost 篇

序言请移步此处

MSVC STL 的分析版本请移步此处

Libstdc++ 的分析版本请移步此处

注:因为这不是第一篇分析,所以会直入主题,跳过文学写作常用的累赘的过渡。

目标版本选择

选用最新的 Boost 1.67 作为研究目标

在开始正题前,先简单看一下 shared_ptr 的类成员,方便后续分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace detail {

template< class T > struct sp_element
{
typedef T type;
};

}

template<class T>
class shared_ptr {
public:
typedef typename boost::detail::sp_element< T >::type element_type;

// omitted other

private:
element_type * px; // contained pointer
boost::detail::shared_count pn; // reference counter
};

Read More

Monthly Read Post in Apr 2018

What is Load Balancing?

Digital Ocean 出品的良心文章,覆盖了:

    Read More

    std::function Must be Copyable

    前几天在写一个 ThreadPool 的轮子的时候,碰到一个问题:无论我用什么办法,都不能将 std::packaged_task 传递到 std::function 中,编译器始终提示访问了 std::packaged_task 被删除的拷贝构造函数。

    Read More

    Use Lambda With PostTask

    曾经为了能在 PostTask() 里使用 lambda,实现了一个自动将 non-capturing lambda decay 到对应函数指针,在利用 base::Bind() 的方案[1]

    Read More

    利用 vcpkg 编译带汇编优化的 libx264

    使用 vcpkg 编译 libx264 有一个很重要的原因:可以获得 PDB,而且构建流程被大大精简了。

    但是这里有一个坑:vcpkg 上的 libx264 模块编译默认是开启了 --disable-asm,意味着构建之后的二进制不会使用 SIMD 指令集,所以性能上会有很大的问题。

    Read More

    Monthly Read Posts in Mar 2018

    Sorting, caching and concurrency

    通过引入基于时间的 sliding window 来标记并剔除(大概率)由错误产生的数据;并且可以利用 SW 来 schedule 数据什么时候从内存持久化到磁盘。

    Read More

    浅析 shared_ptr:Libstdc++ 篇

    序言请移步此处

    MSVC STL 的分析版本请移步此处

    注:因为这不是第一篇分析,所以会直入主题,跳过文学写作常用的累赘的过渡。

    版本选择与源码位置

    目前的工作机是 Linux Mint 18,对应的是 Ubuntu 16.04 LTS。

    这个版本的系统上源包默认提供的是 GCC 5.4 和 clang 3.8,跟随的 libstdc++ 的大版本是 6。

    考虑到 Linux 上 clang 也是默认使用 libstdc++,且 GCC 6/7/8 使用的 libstdc++ 的大版本都是 6,因此直接选用目录 /usr/include/c++/5 下的源码作为研究对象。

    Read More