<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[云彩挂上的二叉树]]></title><description><![CDATA[技术博客移步至: http://orzz.org]]></description><link>https://blog.youkuaiyun.com/markl22222</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; markl22222]]></copyright><item><title><![CDATA[C++的杂七杂八：如何实现一个简单的bind]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/43989765</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/43989765</guid><author>markl22222</author><pubDate>Sat, 28 Feb 2015 20:47:04 +0800</pubDate><description><![CDATA[Wrote by mutouyun. (http://orzz.org/cxx-bind/)


这篇文的草稿我是在2014年5月11号开始打的，可是拖拖拉拉直到现在才真正动笔写，自己对自己也是醉了。。
之所以写bind而不是什么其他的东西，是因为bind在各种C++的utility里面可以说是最能体现出“利用语言本身来拓展语言功能”这一特征的了。

在C++98/03的时代，人们为了]]></description><category></category></item><item><title><![CDATA[一款C++静态分析工具 —— CppDepend]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/43989609</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/43989609</guid><author>markl22222</author><pubDate>Sat, 28 Feb 2015 20:31:34 +0800</pubDate><description><![CDATA[Wrote by mutouyun.
 (http://darkc.at/cppdepend/)

 

去年6月份的时候，CppDepend的一位技术社区经理（technical community manager）突然发邮件联系我，赠送了我一份license，并邀请我体验下他们的C++静态分析工具，也就是CppDepend。
在这款软件的官方网站上，我们可以看到使用CppDepen]]></description><category></category></item><item><title><![CDATA[内存池之一：基本概念]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/43989583</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/43989583</guid><author>markl22222</author><pubDate>Sat, 28 Feb 2015 20:23:09 +0800</pubDate><description><![CDATA[Wrote by mutouyun.
 (http://darkc.at/memory-pool-basic-concepts/)

 

1. 内存池是什么
内存池（Memory Pool），是内存分配器（Memory Allocation）的一种表现形式。它以预存储的方式预先分配一大块内存（相对于每次请求的内存大小来说），使得绝大部分的内存请求只需要在已分配的大块内存上划分出一小块]]></description><category></category></item><item><title><![CDATA[关于内存对齐的那些事]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/38051483</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/38051483</guid><author>markl22222</author><pubDate>Tue, 22 Jul 2014 21:53:58 +0800</pubDate><description><![CDATA[Wrote by mutouyun. (http://darkc.at/about-data-structure-alignment/)


1. 内存对齐（Data Structure Alignment）是什么

内存对齐，或者说字节对齐，是一个数据类型所能存放的内存地址的属性（Alignment is a property
 of a memory address）。
这个属性]]></description><category></category></item><item><title><![CDATA[为什么直接杀死线程是不好的]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/33310953</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/33310953</guid><author>markl22222</author><pubDate>Sun, 22 Jun 2014 11:39:08 +0800</pubDate><description><![CDATA[Wrote by mutouyun. (http://darkc.at/why-shouldnt-i-kill-a-thread/)


我们知道，windows里有个API叫TerminateThread，它可以干掉任何正在欢快小跑的线程。对应的，liunx里则是pthread_cancel（不是pthread_kill，这玩意本质是向线程发信号，而不是杀死线程）加上PTHREAD_CAN]]></description><category></category></item><item><title><![CDATA[使用模板元编程操作类型集合（C++11下的TypeList）]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/27387487</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/27387487</guid><author>markl22222</author><pubDate>Wed, 28 May 2014 22:44:01 +0800</pubDate><description><![CDATA[Wrote by mutouyun. (http://darkc.at/cxx-type-list/)


群里有个朋友要实现这么一个功能：如何在编译期把一个函数类型的参数减少一个。
简单来说，就是实现下面这个模板：

remove_func_par::type; // type = void(int, long)
根据输入的编译期整数，把函数参数表里对应的参数干掉一个。
为了实现]]></description><category></category></item><item><title><![CDATA[一段tricky code]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/26012377</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/26012377</guid><author>markl22222</author><pubDate>Fri, 16 May 2014 22:03:06 +0800</pubDate><description><![CDATA[Wrote by mutouyun. (http://darkc.at/a-tricky-code/)


刚刚在网上闲逛，看到reddit上关于最受欢迎的代码的讨论贴，上面有一小段非常有意思的代码：

unsigned int v; // to count the number of bits set in v
unsigned int c; // c accumulates the ]]></description><category></category></item><item><title><![CDATA[如何在C++中获得完整的类型名称]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/25928597</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/25928597</guid><author>markl22222</author><pubDate>Fri, 16 May 2014 00:37:02 +0800</pubDate><description><![CDATA[折腾C++的类型系统是一个很有意思的事情。当钻进去之后就会发现，一些原先比较晦涩的基本概念，在研究的过程中都清晰了不少。
check_type的实用价值在于，可以利用它清晰的看见C++中一些隐藏的类型变化。比如完美转发时的引用折叠。

在实现check_type的过程中，用到了不少泛型，甚至元编程的小技巧，充分运用了C++在预处理期、编译期和运行期（RAII）的处理能力。虽然这些代码仅是学习研究时的兴趣之作，实际项目中往往typeid的返回结果就足够了，但上面的不少技巧对一些现实中的项目开发也有一定的参考和]]></description><category></category></item><item><title><![CDATA[用mingw静态编译Qt4.8.2和Qt5.1.1]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/20734085</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/20734085</guid><author>markl22222</author><pubDate>Fri, 07 Mar 2014 21:02:13 +0800</pubDate><description><![CDATA[因为一些乱七八糟的原因，我需要用mingw静态编译Qt4.8.2和Qt5.1.1。
经历了一天的折腾之后，自觉编译一下Qt还是件颇为麻烦的事情，故将过程略作总结，以备不时之需。

首先，在编译之前，我需要下载mingw、qt-everywhere-opensource-src-4.8.2和qt-everywhere-opensource-src-5.1.1。

然后，准备开始编译了，当然]]></description><category></category></item><item><title><![CDATA[UTF-8、UTF-16、UTF-32编码的相互转换]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/19770505</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/19770505</guid><author>markl22222</author><pubDate>Sun, 23 Feb 2014 21:37:34 +0800</pubDate><description><![CDATA[最近在考虑写一个可以跨平台的通用字符串类，首先需要搞定的就是编码转换问题。

vs默认保存代码文件，使用的是本地code（中文即GBK，日文即Shift-JIS），也可以使用带BOM的UTF-8。
gcc则是UTF-8，有无BOM均可（源代码的字符集可以由参数-finput-charset指定）。
那么源代码可以采用带BOM的UTF-8来保存。而windows下的unicode是UTF-16编码；linux则使用UTF-8或UTF-32。因此不论在哪种系统里，程序在处理字符串时都需要考虑UTF编码之间的相互]]></description><category></category></item><item><title><![CDATA[关于设计模式的7种坏味道和11种原则]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/17055773</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/17055773</guid><author>markl22222</author><pubDate>Sun, 01 Dec 2013 15:11:38 +0800</pubDate><description><![CDATA[设计模式作为一组抽象的设计思想,肯定有一些基本的原则.否则的话,任何设计都可以称之为"良好设计"的一种了.
在设计模式中,也有整体"不允许"和"需要遵循"的方方面面.只要遵循了下面这些基本思想,写出来的设计往往都是很优秀的设计.






7种坏味道


僵化性: 说白了就是整个系统过于僵硬,没办法或很难针对其中的某个需要修改的地方做灵活的调整,牵一发而动全身.
脆弱性:]]></description><category></category></item><item><title><![CDATA[C++设计模式之Prototype(原型)模式]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/17055273</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/17055273</guid><author>markl22222</author><pubDate>Sun, 01 Dec 2013 13:59:58 +0800</pubDate><description><![CDATA[当我们需要创建一种类型的对象时,可以用工厂模式;当对象的局部容易发生变化时,我们有建造者模式.但当我们有大量的对象类型,或者对象类型不易知道时,我们如何根据已有的一个对象快速构建新的对象呢?
我们需要一个可以封装掉不同种类对象之间的区别,仅伸出相同的克隆接口,让所有的对象只需要考虑自身的复制.这样我们就可以快速得到大量相同类型的对象了.

具有这种特征的模式是原型模式.其类图如下:

]]></description><category></category></item><item><title><![CDATA[C++设计模式之Builder(建造者)模式]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/17055215</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/17055215</guid><author>markl22222</author><pubDate>Sun, 01 Dec 2013 13:50:59 +0800</pubDate><description><![CDATA[我们可能会遇到这种情况,比如一个配置文件读取模块,它由几个小模块组成,每个小模块负责读取一种类型的配置.我们读取配置的顺序和过程是固定的,但是每个配置类型可能会因为业务的需求发生很多变化.
这个过程和造房子有点像.每栋楼的建造过程是差不多的,但是各个部件在每栋楼里各不相同.

有没有这样一种模式,可以帮我们应对这种复杂对象的各个部分频繁变化的需求呢?

建造者模式就是这样一种模式.它提供]]></description><category></category></item><item><title><![CDATA[C++设计模式之Factory(工厂)模式]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/17055101</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/17055101</guid><author>markl22222</author><pubDate>Sun, 01 Dec 2013 13:35:15 +0800</pubDate><description><![CDATA[工厂模式一般是学习设计模式的第一课,它本身也是创建型模式中较为常用的一种模式.
工厂模式希望解决的是"如何高效而方便的创建当前需要的对象"的问题.当一个对象对外提供的接口稳定,而这类对象的具体实现容易发生变化时,我们可以考虑使用工厂来封装对象的实现变化,并提供统一的对象创建方法.

工厂模式可以分为三种不同的模式,分别对应不同情况下的解决方案.






1.简单工厂模式]]></description><category></category></item><item><title><![CDATA[nixyx —— 一个小巧的项目工程/编译文件生成器（构建系统？）]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/17040771</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/17040771</guid><author>markl22222</author><pubDate>Sat, 30 Nov 2013 15:10:53 +0800</pubDate><description><![CDATA[恩。。nixyx确实算不上是一个构建系统。
所谓构建系统，比如GNU的Autotools，那是一套很完整的构建体系，包括了程序的配置，编译和安装三大部分。

类似的软件还有：google的gyp、腾讯的Blade等。
它们最大的好处在于，可以不考虑平台之间的差别，使用统一的配置文件和命令，做到跨平台部署。

它们往往还支持很多很高端的功能，比如集成自动测试，代码检查（Blade）。。]]></description><category></category></item><item><title><![CDATA[C++的杂七杂八：我家的返回值才不可能这么傲娇（右值引用和移动语义）]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/13167545</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/13167545</guid><author>markl22222</author><pubDate>Sun, 27 Oct 2013 09:43:18 +0800</pubDate><description><![CDATA[大凡编程语言，都会有“函数”这个概念。而对于外部而言，一个函数最重要的部分就是它的返回值了。
直接通过返回值将函数的计算结果返回出去，不论是函数还是调用者都会身心愉悦，因为这是最自然的使用方法了。但是在C++里，通过函数返回值返回处理结果往往是一种奢侈的行为。]]></description><category></category></item><item><title><![CDATA[C++ 下 typeof 的实现]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/10474591</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/10474591</guid><author>markl22222</author><pubDate>Wed, 28 Aug 2013 22:26:51 +0800</pubDate><description><![CDATA[现在我们有这样一坨代码：std::vector arr;
// ...
for(std::vector::iterator iter = arr.begin(); iter != arr.end(); ++iter)
{
    // ...
}其中难看而又不好维护的std::vector::iterator，由于我们无法自动获知arr.begin()的类型，从而不得不一写再写。C++11下有ty]]></description><category></category></item><item><title><![CDATA[跨平台的原子操作及简单的循环锁实现]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/10474175</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/10474175</guid><author>markl22222</author><pubDate>Wed, 28 Aug 2013 22:00:42 +0800</pubDate><description><![CDATA[原子操作一直是多线程编程中的重要杀器之一。Win32里我们有Interlocked系列API，其他平台下也有各自的原子操作接口。如果想要让我们的程序能够拥有跨平台且统一的多线程调度方案，那么就必须得把不同的操作接口统一。首先，我们需要定义一套平台判断宏，来方便我们决定使用何种接口：#if defined(WINCE) || defined(_WIN32_WCE)
#   define NX_OS_]]></description><category></category></item><item><title><![CDATA[高斯模糊算法的实现和优化]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/10313565</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/10313565</guid><author>markl22222</author><pubDate>Mon, 26 Aug 2013 00:07:10 +0800</pubDate><description><![CDATA[前两年我发过一文：Win32下的C++高斯模糊算法实例，里面给出了一个高斯模糊的实现，并写了粗略的简介。

不过当时内容讲得非常简单，而且附带的例子算法是有缺陷的：

一是对图片的边角采用“跳过”的方式处理，导致模糊后的图片有黑边；
	二是算法本身采用的是二维矩阵，效率上不如一维高斯模糊好。
鉴于此，这里重新整理并试图完整的讲述一下高斯模糊。

一、高斯模糊是什么

模糊算法，不论是使用哪种算法，...]]></description><category></category></item><item><title><![CDATA[New web site...]]></title><link>https://blog.youkuaiyun.com/markl22222/article/details/6308575</link><guid>https://blog.youkuaiyun.com/markl22222/article/details/6308575</guid><author>markl22222</author><pubDate>Fri, 08 Apr 2011 01:22:00 +0800</pubDate><description><![CDATA[技术博客移步至: dark-c.at]]></description><category></category></item></channel></rss>