• C++ STL 内存配置的设计思想与关键源码分析

    Posted by : lon.y@qq.com on 2017年7月4日

    说明:我认为要读懂STL中allocator部分的源码,并汲取它的思想,至少以下几点知识你要了解:operator new和operator delete、handler函数以及一点模板知识。否则,下面你很可能看不大明白,补充点知识再学习STL源码比较好。 下面会结合关键源码分析C++STL(SGI版本)的内存配置器设计思想。关键词既然是“思想”,所以重点也就呼之欲出了。 1、allocator的简短介绍 我阅读的源码是SGI公司的版本,也是看起来最清楚的

    阅读全文...

  • C++ 中命名空间的 5 个常见用法

    Posted by : lon.y@qq.com on 2017年7月4日

    译者注:可能很多程序员对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命名空间定义了新的作用域。它们提供了一种避免名称冲突的方法。 c++ 中的命名空间通常用于避免命名冲突。尽管命名空间在最近的 c++ 代码中广泛使用,但大多数较旧代码都不使用此工具。 基于对众多C++项目源码的探索与研究,总结出了在这些项目中使用命名空间的一些常

    阅读全文...

  • 解读 C 语言中的指针

    Posted by : lon.y@qq.com on 2017年7月4日

    我想对很多学习C语言的新手来说,指针无疑是一个难点。但是,我觉得指针也是C语言特别重要的一个特性。也许,你在除了C和C++以外的编程语言中,很少看到指针。而C++中,也多用引用,而非指针。指针,作为一种高效的工具,可谓是一把双刃剑——用得好,可以大大提高程序效率,但用的不好,就是很多bug的滋生地。 这或许也是人们对指针褒贬不一的原因吧。就我个人而言,我还是很喜欢这个特性,因为我需要经常和硬件以及一些底层的软件打交道。这个时候,指针便体现出它独特的魅力。指

    阅读全文...

  • 图说C++对象模型:对象内存布局详解

    Posted by : lon.y@qq.com on 2017年7月4日

    0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局、虚表指针、虚基类指针等有深入了解的朋友可以慢慢看。本文的结论都在VS2013上得到验证。不同的编译器在内存布局的细节上可能有所不同。 文章如果有解释不清、解释不通或疏漏的地方,恳请指出。 1.何为C++对象模型? 引用《深度探索C++对象模型》这本书中的话: 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分。 对于各种支持的底层实现机制。 直接支持面向对象程序

    阅读全文...

  • 有了垃圾回收,还会不会发生内存泄漏?

    Posted by : lon.y@qq.com on 2017年7月4日

    问题的发现 这个问题是我在写C++时考虑到的,C++需要手动管理内存,虽然现在标准库中提供了一些智能指针,可以实现基于引用计数的自动内存管理,但现实环境是很复杂的,我们仍要注意循环引用的问题。还有一个容易被忽视的问题就是对象间关系的“占有”和“非占有”,这个问题其实在具有GC的C#和Java中也一样存在。 目前.NET和Java的GC策略都属于Tracing garbage collection,基本原理是从一系列的root开始,沿着引用链进行遍历,对遍历

    阅读全文...

  • C++ 之 stl::string 写时拷贝导致的问题

    Posted by : lon.y@qq.com on 2017年7月4日

    前几天在开发某些数据结构到文件的 Dump 和 Load 功能的时候, 遇到的一个 bug 。 问题复现 问题主要出在 Load 过程中,从文件读取数据的时候, 直接使用 fread 的去操作 string 的内部指针地址 (char*)s.c_str() 。 简化后的示例代码如下(testdata1文件内容是12345): void Load(string& s, size_t offset, size_t size) { s.resize(si

    阅读全文...

  • C++11 新特性之类型推断与类型获取

    Posted by : lon.y@qq.com on 2017年7月4日

    C++11新特性之新类型与初始化: http://blog.jobbole.com/102728/ 这是C++11新特性介绍的第二部分,涉及到C++11这次更新中较为重要的特性类型推断(auto)与类型获取(decltype)。 不想看toy code的读者可以直接拉到文章最后看这部分的总结。 简单的类型推断 C++11新标准中增加了auto类型说明符,可以让编译器帮我们分析表达式的类型。 double val1 = 1.1, val2 = 2.2; au

    阅读全文...

  • C++11 新特性之智能指针

    Posted by : lon.y@qq.com on 2017年7月4日

    前四篇在这里: C++11新特性之新类型与初始化:  http://blog.jobbole.com/102728/ C++11新特性之类型推断与类型获取:  http://blog.jobbole.com/104559/ C++11新特性之lambda:http://blog.jobbole.com/104548/ C++11新特性之容器相关特性: http://blog.jobbole.com/104563/ 这是C++11新特性介绍的第五部分,涉及到

    阅读全文...

  • C++ 线程池实现原理

    Posted by : lon.y@qq.com on 2017年7月4日

    背景 多线程编程是C++开发者的一个基本功, 但是很多开发者都是直接使用公司给包装好的线程池库, 没有去了解具体实现,有些实现也都因为高度优化而写得讳莫如深,让初学者看得吃力。 所以写这篇文章主要是想以非常简单的方式讲讲实现原理, 希望初学者看完之后不是觉得「不明觉厉」,而是觉得「原来如此」。 面朝代码 首先先来一段超级简单(注释丰富)的代码展示多线程编程的经典写法。 注: 该段代码和完整运行示例请见 limonp-thread-pool-programm

    阅读全文...

  • C++11 新特性之 lambda

    Posted by : lon.y@qq.com on 2017年7月4日

    前两篇在这里: C++11新特性之新类型与初始化: http://blog.jobbole.com/102728/ C++11新特性之类型推断与类型获取: http://blog.jobbole.com/104559/ 这是C++11新特性介绍的第三部分,涉及到C++11这次更新中较为重要的lambda表达式。 不想看toy code的读者可以直接拉到文章最后看这部分的总结。 lambda 简介 熟悉Python的程序员应该对lambda不陌生。简单来说,

    阅读全文...