
C++
jadedrip
软件工程师
展开
-
全新的内存分配算法(折纸算法)
全新的内存分配算法,这个算法适合可变长对象,并且经常要扩展的内存块的分配,比如字符串。是空间换时间的算法。想象一张长长的纸条,不断的对折它,就可以把纸条分成一格一格,而且每次对折格子小一半,数量多一倍是吧。这个算法和这个过程很想,因此我命名为折纸算法。原创 2013-10-17 22:50:39 · 3221 阅读 · 3 评论 -
VC 2010 的 Lambda 是美丽的语法糖
Lambda 是个函数对象,因此不能内联优化。原创 2010-09-16 10:16:00 · 2445 阅读 · 0 评论 -
多线程无锁(lock-free) 堆的实现
堆的多线程化处理比较简单,它只有一个指向堆顶的变量需要竞争,因此我们可以很方便的用 cas 操作来完成。/* * Copyright (C) 2010 Chen Wang ( China ) * Email: jadedrip@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General原创 2010-06-18 15:22:00 · 2987 阅读 · 5 评论 -
再谈 高性能无锁(Lock-free) 内存池
讨论无锁(Lock-free)算法的效率问题原创 2010-08-12 14:08:00 · 4965 阅读 · 2 评论 -
多线程无锁(lock-free)队列(queue)的实现探讨
前面我实现了一个无锁堆,下面打算实现无锁的 FIFO 队列。原创 2010-06-20 20:49:00 · 11586 阅读 · 2 评论 -
用C/C++为 Lua 脚本设置全局表变量
Lua 使用压栈的方式,通过 C++向 Lua 传输数据。因此我们想为 Lua 环境设置全局的表变量时,可以这么做://把环境变量导入到 lua 的全局表 "environ" lua_newtable(L);//创建一个表格,放在栈顶 lua_pushstring( L, key ); lua_pushstring( L, value ); lua_settable( L,-3 );//弹出key,value,并设置到table里面去 lua_pushnumber( L, ikey );原创 2010-06-13 10:23:00 · 2999 阅读 · 1 评论 -
通过 LuaBind 让 C++函数返回Lua表
由于要返回表,我们的C++函数需要返回 luabind::object 对象。并且在绑定时指定 raw 策略。原创 2010-06-12 10:22:00 · 3606 阅读 · 5 评论 -
构建 Lua、LuaBind 的 C++ 编译环境
我写了部分 bjam 脚本来编译一些第三方库,以便能更方便的在 VC 中使用。主要原理是使用 boost 的库命名规则,以防止连接错误。这里主要涉及:lua, luabind. 附赠 cryptopp、curl、openssl、sqlite原创 2010-06-12 11:28:00 · 4141 阅读 · 0 评论 -
高性能无锁(Lock-free) 内存池
由于懒惰,一直脱到现在才完成,实在是罪过啊!很快会用它来改写我的无锁容器,嗯,如果我不懒惰的话。稍微解释一下关键问题:先分配一块内存,然后将内存划分为等大的内存格。每次调用 alloc 就分配一块内存格出去。可分配内存是个链表,这个链表被直接贮存在未分配的内存里。换句话说,未被分配的内存格里存放了一个指针,这个指针指向下一个未被分配的空闲内存格。另外,为了我们分配的内存可以被正确释...原创 2010-08-04 10:42:00 · 7099 阅读 · 10 评论 -
四则运算的源代码
借助堆栈实现的四则运算的源代码。输入一个字符串,可以计算值。支持加减乘除、小数点、括号。原创 2010-10-14 17:03:00 · 2888 阅读 · 0 评论 -
中国象棋将帅问题的另类解法
<br />编程之美里有个将帅问题蛮有意思的,该问题的具体描述是:(根据中国象棋的基本原则)在只有双的将帅棋盘上,找出所有双方可以落子的位置(将帅不能碰面),但只能使用一个变量。<br /> <br />解法一般也就是 循环然后判断去除重复位置。而对于只能用一个变量的限制一般通过把变量拆成2个来解决。<br /> <br />我有一个全新的思路,不做判断,不拆变量,直接用计算来解决问题。<br />附算法源程序:<br />int _tmain(int argc, _TCHAR* argv[]){原创 2011-05-11 11:01:00 · 2410 阅读 · 2 评论 -
用来分析 Url 的正则式
用来分析 Url 的正则式原创 2011-04-02 15:03:00 · 2092 阅读 · 0 评论 -
谈谈 C++ 和 Java 的区别
我有多年的 C++ 开发经验,但是最近由于公司的关系,不得不转 Java。看了几天 Java,谈谈感想。 经验丰富的 C++ 程序员应该可以很容易转到 Java 上来,因为他们有许多相似之处,基本语法是完全一样的,只是 Java 砍掉了大量的 C++ 特性,仅仅保留了类相关的部分,在 Java 的世界里,一切都是类。原创 2013-09-29 10:07:14 · 2081 阅读 · 1 评论 -
疯狂的预编译加类型推导能孵化什么吗?
Boost 是个庞然大物,也许很多人已经把它用得很顺了,不过它包含的两个库 MPL 和 Preprocessor 应该大部分人都不会熟悉。MPL 是用来进行模版元编程的工具,它将一些对象的推导工作做了抽象,可以把类型放入容器,在编译期实现一些很神奇的功能。Preprocessor 为预编译提供了一系列的工具,帮助通过预编译来生成代码。它们的结合帮助你在编译期实现很多强大的功能。原创 2013-09-04 15:25:09 · 2032 阅读 · 0 评论 -
TBB 的 BUG?
Threading Building Blocks 是很优秀的一个库,个人用得很多。近几天调试程序的时候,发现 tbb 的 _concurrent_queue_impl.h 166 行左右有这么一段代码: void assign_and_destroy_item( void* dst, page& src, size_t index ) { T& from原创 2013-08-15 08:59:51 · 1945 阅读 · 1 评论 -
"优雅"的C++观察者模式实现
C++ 是一种强类型的编程语言,于是最近一直在头疼如何实现一个比较优雅的观察者模式。如果一个事件附带的参数不同的时候,是否可以使用统一的界面来注册?比如我定义了一个事件,A,参数是 int,而事件B的参数是 string,如果采用统一的注册接口?最先想到的办法是事件用int 定义,采用 boost::any 来传递参数,而结束函数统一写成 void hand( boost::any a ) 这原创 2013-04-28 16:37:42 · 3170 阅读 · 2 评论 -
像脚本语言一样写C++
疯狂的类型推导+虚函数+RTTI,会带来怎么样的东东?最近写了一个好玩的类 object, 目标是可以像脚本语言一样,存放任意类型,做任意操作。目前完成了大半,有兴趣的朋友可以拿来玩玩。 这个类可以这么玩void main(){ using namespace lugce; /// 当字符串 std::stringzz="zz";原创 2013-01-17 17:09:25 · 2671 阅读 · 3 评论 -
右值引用如何改变你的程序?
点击查看原创 2013-01-15 14:23:00 · 1823 阅读 · 0 评论 -
STL & Boost 相关中文信息收集(持续更新中)
STL & Boost 相关中文站点信息STL中文站 STLChina.orgSTLChina.org 的 Boost 中文站Boost 文档中文翻译组(google groups,上去也许需要想点办法),他们的 SVN: https://boost-doc-zh.googlecode.com/svn/trunkBoost 安装文档B原创 2006-03-06 10:24:00 · 4291 阅读 · 4 评论 -
boost.string_algo - 字符串算法库 使用点滴
用来记录零碎的知识,防止自己忘了判断一个字符串是否全为数字:boost::all( str, boost::is_digit() );原创 2011-08-04 17:09:43 · 2704 阅读 · 0 评论 -
boost.asio 使用点滴
用来记录一些零散的知识点,防止自己以后忘了。socket 的 async_connect 被调用以后,is_open 立刻就会返回 true。原创 2011-07-20 16:26:32 · 2114 阅读 · 0 评论 -
使用 Crypto++ 里的 Blowfish 加密数据
BlowFish算法用来加密64Bit长度的字符串,它所使用的密钥是对称的。Crypto++ 里的 Blowfish 加密使用起来非常简单。原创 2010-05-31 17:09:00 · 1610 阅读 · 0 评论 -
使用 bjam 构建 crypto++
最近打算使用 crypto++ 5.6.0 , 由于我的机器上装了不同版本的 vc, 为了构建方便,写了 bjam 的构建脚本,可以方便的用不同的编译器编译库和DLL,十分方便。 jamroot 文件import os ; import pch ;import path ; import common ; default-build = debug原创 2010-05-28 16:40:00 · 1168 阅读 · 0 评论 -
获取成员变量类型
这应该是模板元编程里的概念吧,有时候我们确实需要获取成员变量的类型,这里提供一个方法借助模板的偏特化达到目的:templatestruct MemberType;templatestruct MemberType{ typedef F member_type; typedef T class_type;}; 假设我们有个结构定义如下:struct Call原创 2010-05-12 16:47:00 · 1200 阅读 · 0 评论 -
Lockfree 习作:最多保存56个对象的简单容器
/// 最多可以存放 56 个数值的容器 template class SafeValuePool { public: SafeValuePool() : _mark(0) {} uint8 lock() { for( ;; ){ for( int i=0; i assert( (_mark & 0xFFFFFFFFFFFFFF00LL)== 0xFFFFFFFFFFFFF原创 2008-03-17 14:09:00 · 759 阅读 · 0 评论 -
无锁(lock-free)队列的一个简单实现
作为 无锁的 ( lock-free ) 线程安全算法 的一个习作吧。思想、算法十分简单。#ifdef WIN32 inline void sleep( uint32 mil ) { Sleep( mil ); } inline bool CAS(void* pDest, uint32 cmp, uint32 xchg){ return Interloc原创 2008-03-06 14:18:00 · 3055 阅读 · 5 评论 -
C++ 模板类型推导过程中的隐式类型转换
在一篇 《CUJ:高效使用标准库:显式函数模板参数申明与STL 》中发现了这么一端话: 基于全面,需要指出,对我们的例子的自动参数推导中,左值到右值的转换不是在推导出模板参数前所使用的唯一一个隐式类型转换。 在决定模板参数类型前,编译器执行下列隐式类型转换: 左值变换 修饰字转换 派生类到基类的转换 见《C++ Primer》([注2]原创 2008-02-25 10:40:00 · 3065 阅读 · 0 评论 -
胡思乱想 C++ 模板
突然有个想法,在这里记录下来。C++ 委员会的工作人员正在给C++的模板添加更多特性,那么干嘛不直接把模板直接做成可编程的?直接支持 For 循环等等编程能力,而不用使用一大堆偏特化之类的技巧来完成本来很简单的工作(比如循环)。比如这样的代码:templatevoid func( T );templatevoid func( T ){}t原创 2008-01-31 09:44:00 · 720 阅读 · 0 评论 -
使用 dbghelp.dll 进行 Release 除虫
参考: http://blog.csdn.net/ArCoolGG/archive/2007/04/05/1553027.aspx 首先,写一个 异常处理函数。std::ostream& operator { // return os }// 这个处理函数调用 Nick 的 minidump 创建 dmp 文件。#include "minidump.h"LO原创 2007-10-16 15:04:00 · 3294 阅读 · 0 评论 -
解析 Boost 库的文件名
Boost 库编译的 Lib 文件按下面的规则组合文件名:BOOST_LIB_PREFIX + BOOST_LIB_NAME + "_" + BOOST_LIB_TOOLSET + BOOST_LIB_THREAD_OPT + BOOST_LIB_RT_OPT + "-" + BOOST_LIB_VERSION这些定义为:BOOST_LIB_PREFIX: 静态库为 "lib"原创 2007-08-21 09:59:00 · 1513 阅读 · 0 评论 -
无锁的 ( lock-free ) 线程安全算法
友情提示:对 Lock-free 算法没概念的朋友,请先看下面的参考。算法描述Lock-free 算法的基础是 CAS (Compareand-Swap) 原子操作。当某个地址的原始值等于某个比较值时,把值改成新值,无论有否修改,返回这个地址的原始值。目前的cpu 支持最多64位的CAS。并且指针 p 必须对齐。 注:原子操作指一个cpu时钟周期内就可以完成的操作,不会被其他线程干扰。原创 2007-08-08 14:36:00 · 15382 阅读 · 3 评论 -
神秘的 Allocator
先看看 std::vector 的声明template class Type, class Allocator = allocatorType> >class vector 这个 allocator 一般我们很少用到,这个 allocatior 完成了分配内存的工作,对于小内存,它使用了线程池来优化效率。比较具体的介绍可以参考 http://www.stlchina.org/twik原创 2007-08-07 15:25:00 · 2048 阅读 · 0 评论 -
析构函数的秘密
C++ 对虚拟析构函数的解释:By making the Base class Destructor virtual, both the destructors will be called in order. The order of execution of destructor in an inherited class during a clean up is like this. 1原创 2006-01-26 10:23:00 · 1310 阅读 · 2 评论 -
Lockfree 程序中内存释放的另类方法
C++ 的 Lockfree 程序中的内存释放问题是个很大的难点,甚至有些时候被认为是无法解决的,除非C++改变。这里提出一个比较另类的解决方案,希望能起到抛砖引玉的作用。一个对象安全删除的难点在于不知道有多少线程正在访问它,因此一个线程很难确定自己正在读的对象没有被其他线程删除,这里我使用逆向思维的办法来解决这个问题。对于一个 Lockfree 容器,线程访问时,进行注册,将一个Lockfr原创 2008-03-16 21:57:00 · 1142 阅读 · 2 评论 -
基于状态机思想的 Xml SAX解析器
学习状态机的练习之作,使用 switch 的方式。 不多说,看代码:/// 节点开始 class fsm_xml; class fsm_attrib { // 获取属性值 public: fsm_attrib() { _state=0; } void init(){ _state=0; _attrname.clear(); _attrvalue.clear(); } const ws原创 2008-04-07 09:19:00 · 962 阅读 · 0 评论 -
C++、数据库、模板、操作符重载、乱想
正在考虑如果封装数据库操作,以便隐藏更多数据库的细节,让不懂 SQL 的开发者可以用 C++ 来描述他所要做的。 使用模板、操作符重载,也许我们能写出 这样的代码: struct Item { int id; int value; int useless; }; Database db("database_name"); db.Open( "ro原创 2008-07-02 13:37:00 · 753 阅读 · 0 评论 -
也谈生成不重复的随机数系列(洗牌算法)
偶尔看到有人在讨论如何生成不重复的随机数系列(洗牌算法),发现他们用的方法复杂度十分高,要抛大量的随机数,因此把我以前用的洗牌算法也拿出来秀秀。 假设需要生成 1~54 的随机数,那么把 1~54 放入“未洗牌数组”,抛 0~53 的随机数,把指定序号的牌,放入“洗好牌的数组",然后用未洗牌数组中最后一张牌替换已经被拿走的牌。下一步,抛 0~52 的随机数…… 重复 53 次就原创 2010-05-10 11:13:00 · 2883 阅读 · 18 评论 -
InternetOpenUrl 函数
InternetOpenUrl函数通过一个完整的FTP,Gopher或HTTP网址打开一个资源。HINTERNET InternetOpenUrl (__in HINTERNET hInternet ,__in LPCTSTR lpszUrl ,__in LPCTSTR lpszHeaders ,__in DWORD值dwHeadersLength ,__i翻译 2010-02-20 13:11:00 · 6153 阅读 · 0 评论 -
解数独游戏的源代码
公司搞了个小活动,让大家玩数独游戏,作为一个程序员,第一考虑就是用 C++ 穷举,于是就有了下面的代码:#include "stdafx.h"bool check( int buf[9][9], int j, int i ){ int v=buf[j][i]; // 检测横向是否有冲突 for( int l=0; l<9; l++ ) if( (l!=i) && (b原创 2010-01-22 14:22:00 · 1033 阅读 · 0 评论 -
使用 boost::signals2 的智能连接管理
boost::signals2 提供了使用智能指针的连接管理。可以通过下面的代码生成智能连接: using namespace boost::signals2;boost::shared_ptr class_ptr; // 这是观察者的智能指针 signal shoter; // 这就是我们的信号发射器了 typedef signal::slot_type sl原创 2009-11-11 16:04:00 · 1484 阅读 · 2 评论