摘要: 经常会用到C的格式化字符串,gcc/clang的扩展,都是可以进行字符串和可变参数的检测,不匹配,就会爆warning.自己手写的,需要加上一点代码,否则不会进行检测.1. 可变参数void my_printf(const char* format, ...) __attribute__ ((format (printf, 1, 2)))这里的1, 表示format string所在参数的下标(从1开始);2表示可变参数开始的下标.2. va_listvoid my_print(const char* format, va_list args) __attribute__ ((format (阅读全文
posted @ 2013-09-05 11:14 egmkang 阅读(546) 评论(0) 编辑
摘要: 今天微博上有人发一个帖子,可以用js来函数式编程. 比如:function f(x, y, z) { return x + y + z;}var f1 = f.bind(null, 1);f1(2,3) === 6; 看完之后,我表我们lua也能实现这样的效果. function bind(f,...) local args={...} return function(...) local local_arg={...} local arg = {} for _,v in pairs(args) do table.insert(ar...阅读全文
posted @ 2013-05-20 16:37 egmkang 阅读(1294) 评论(2) 编辑
摘要: 公司一哥们说make_shared构造shared_ptr比new要慢,我表示怀疑.因为make_shared只分配一次内存,而new需要分配两次.所以写一个demo测试一下.分别测试开启优化,关闭优化,还有就是C++11开启move之后的性能情况.#include <string>#ifdef __GXX_EXPERIMENTAL_CXX0X__#include <memory>using namespace std;#else#include <boost/shared_ptr.hpp>#include <boost/make_shared.hpp阅读全文
posted @ 2013-04-28 13:36 egmkang 阅读(21800) 评论(11) 编辑
摘要: 服务器经常会用到压缩,zlib是默认选择,虽然还有很多其他的快速压缩算法,比如snappy和lz4.可是zlib拥有最广泛的支持和良好的压缩率,就是速度太不理想了.intel有一个高性能库ppl,期中包含zlib的优化.使用方式比较简单,就是链接一下就OK,性能大约可以提升30%左右.我把ppl装到/usr/local/ppl下面,所以有可能会需要添加include路径,看你需要初始化CPU么.include目录/usr/local/ipp/ipp/include然后是静态库/动态库目录:/usr/local/ipp/composer_xe_2013.1.117/ipp/lib/intel64阅读全文
posted @ 2013-01-31 10:37 egmkang 阅读(1229) 评论(0) 编辑
摘要: 立志要把D&E看两三遍,所以这边列一个读书笔记,觉得什么有必要就记下来.1. 内联 在带类的C里面,在类声明里面实现的成员函数,可以被内联.class stack{ //会被内联 char pop() { if(top <= min) error("stack underflow"); return *--top; }}; 在C++里面,提供的inline关键字,也可以用来内联. 另外,static修饰的非成员函数,有internal连接属性,也是可能会被内联掉.2. 窄转换 早期想法不允许"破坏信息的"隐式转换.可是后来发现每个C程序内都阅读全文
posted @ 2013-01-25 01:11 egmkang 阅读(538) 评论(0) 编辑
摘要: 以前都写年制,说了这一年做了啥.其实这一年做了啥不是很要紧,关键是,未来一年要做啥.所以搞个TODO:1. 看书 D&E, GSM, Haskell 如果有精力在看看操作系统方面的2. 网络程序库继续完善3. 股票翻红阅读全文
posted @ 2013-01-25 01:02 egmkang 阅读(695) 评论(3) 编辑
摘要: 生产者消费者问题,是永远的经典. 单纯让多个线程去竞争,占有资源然后处理,会让系统的复杂度变得相当复杂,并且整个系统的并发也很难控制.为了让系统简单化,流畅化,引入消息队列,而且这样,系统更具有相当高的吞吐量.因为做的事情简单而有效. 根据具体业务的不同,个人(认为)把消息队列分为1:1模型,还有就是N:M模型的. 如果消费者的消费能力非常高.个人认为就应该使用1:1的队列.这种队列足够简单,可以进行各种优化,比如避免动态内存分配,锁优化,使用lock-free等.这样可以让主循环的等待时间降到最低,使其可以专心致志进行各种逻辑处理. 有时,有些业务逻辑,不是很在乎时许,允许比较小...阅读全文
posted @ 2012-11-17 21:23 egmkang 阅读(7420) 评论(16) 编辑
摘要: 我实现的网络库中使用了C++11中的shared_ptr. 昨天做profile,发现很多CPU都消耗在shared_ptr上,所以打算看看shared_ptr的效率如何. 实验是这样的,弄一个临时的shared_ptr,然后不停的拷贝,拷贝100W次,看消耗多长时间.实验对象是gcc 4.6.2和clang 3.1(libc++).最后输出各自消耗的时间,编译选项,O0和O2. 上代码:#include <thread>#include <memory>#include <unistd.h>#include <iostream>#include阅读全文
posted @ 2012-11-06 20:55 egmkang 阅读(7252) 评论(5) 编辑
摘要: llvm带来很多很多好用的东西,比如clang,还有一个STL实现:libcxx.其优点不表,就说怎么打印STL容器内的元素吧. 实际上gdb,包括任何调试工具,都是不了解STL的,因为他不知道STL内部是怎么实现的.所以需要展示STL内部元素的时候,就需要用到一些脚本,或者插件之类的(VS也是这样).gdb在7.x支持python写插件,所以很多人都用python插件来打印libstdc++容器内的元素. llvm官方本身没有实现pretty printers,包括lldb这个项目也一样(只是实现了部分容器的parser). 本来还想讲讲怎么实现一个容器的parser,不过想想其实...阅读全文
posted @ 2012-11-02 23:22 egmkang 阅读(1464) 评论(13) 编辑
摘要: C++11带来诸多特性,random就是其一.1. random_device 标准库提供了一个非确定性随机数生成设备.在Linux的实现中,是读取/dev/urandom设备;Windows的实现居然是用rand_s,在这里强烈谴责一下. random_device提供()操作符,用来返回一个min()到max()之间的一个数字.如果是Linux(Unix Like或者Unix)下,都可以使用这个来产生高质量的随机数,可以理解为真随机数.#include <iostream>#include <random>int main(){ std::random_device阅读全文
posted @ 2012-09-06 12:58 egmkang 阅读(21816) 评论(4) 编辑
摘要: gcc 4.6的mutex/thread实现可能有一点问题,导致在用mutex/thread之类的时候,会出现chrono编译出现错误,不能提示.研究了一下,clang 3.1支持libc++的mutex/thread,果断把STL的实现切换到libc++.安装比较容易,编译完成之后,把libc++.so.xxx拷贝到/usr/lib下面,然后创建软连接;再把libc++的头文件拷贝到/usr/include/c++/v1下.编译的时候只需要加上参数-stdlib=libc++,如果要用mutex/thread这些C++11内容,还要加上参数-std=c++11.可是clang complet阅读全文
posted @ 2012-08-29 18:20 egmkang 阅读(1087) 评论(0) 编辑
摘要: 题目不知道怎么取才好,但是意思很简单:如果你暴露一个复杂对象给Lua,实现类似于OO编程的话,那么也要把析构函数暴露给Lua.否则的话,lua gc的时候,回收垃圾对象,没有找到回收函数,就直接free掉了,这在C++中,是相当致命的.tolua++中的tolua_cclass函数,用来注册lua对象,TOLUA_API void tolua_cclass (lua_State* L, const char* lname, const char* name, const char* base, lua_CFunction col)同时会把最后的那个参数col,注册到lua对象的元表里面:sta阅读全文
posted @ 2012-07-01 17:12 egmkang 阅读(7416) 评论(9) 编辑
摘要: 服务器代码依赖了boost的function和bind,用来做回调,异步调用时会出现这种down机.闲话少说上代码:void fn(std::string str);char *temp_str = new char[24];strcpy(temp_str,"1212");boost::function f = boost::bind(fn,temp_str);f();这边的f函数对象里面保存了一个temp_str的指针,如果是同步调用,会有临时的std::string变量产生,产生拷贝一次temp_str,之后就不在引用temp_str,所以不会出现任何问题;可是如果是异阅读全文
posted @ 2012-04-15 16:59 egmkang 阅读(1210) 评论(4) 编辑
摘要: 我们服务器一直在用boost/sgl stl的hash table,但是从来没有考虑过其中的效率问题,虽然hash_map/unordered_map跑的可能真的比map快一些,可能应该不是你理解的那么快.其实他可以更快一些!!! 当我自己尝试着实现了一个hash table之后,我发现确实如此.这篇文章也是来说说,如何实现较快的一个. 通常的hash table都是用开链法,开放地址法来解决冲突.开链法是总容易实现的一个,而且因为效率稳定,被加入了C++11,取名unordered_map.不过效率实在不咋地. 开放地址法的hash table,我是从google-sparseha...阅读全文
posted @ 2012-01-18 14:40 egmkang 阅读(10031) 评论(2) 编辑
摘要: 2011年都干了些啥....读书:1. 聪明的投资者2. 超级数字天才3. 西游记4. 程序开发心理学5. Unix网络编程6. Unix环境高级编程...或者还有其他的,暂时不记得了技术???....好像没干啥,就天天写代码....搞搞C++,Valgrind,Lua,宕机等等2012年,希望自己可以认真的去写写网络程序,虽然号称是写服务器的,但是从来没写过网络程序;希望可以认真的去看看几个开源的代码,研究一下;over阅读全文
posted @ 2012-01-18 13:43 egmkang 阅读(455) 评论(1) 编辑
摘要: 大学还没毕业,买了一些建行,一些交行..... 虽然现在还认为那些股票不错,不过终究发生过换股,全换成浦发,古井贡酒,还有鲁泰,出现了一些亏损,记录如下: 其中塔牌,华兰生物是做短线亏损,其他几个本来打算做长线,后来发现收益较好的品种,换股.... 股票名称 交易亏损(RMB) 农业银行 165.95 交通银行 1675.99 建设银行 288.00 三一重工 290.66 苏宁电器 677.41 塔牌集团 281.30 华兰生物 65.72 一共亏损:3445.82. 谨记.阅读全文
posted @ 2011-12-27 13:27 egmkang 阅读(425) 评论(2) 编辑
摘要: 相信很多人碰到过一个问题,就是代码太多了,不知道在哪里把这个对象给修改掉了.这个其实有两种办法的.1. 在调试的时候,可以下数据断点. gdb有watch断点.比如gdb>watch *(int*)0x12433,要记住,如果想要一只监视这个数据,就要用地址,否则过了这个scope,数据断点就无效了,还有就是,监视的值如果用内置数据类型可以表达的话,是有硬件断点的,否则效率茫茫低.....2. 运行的时候,本文主要讲这个. 先来回顾一下,我们都知道一个exec,都有好几个段,比如代码段,数据段等.这些段是有读写属性的,例如代码段只可以读,栈段是可以读写~~.那么我们就想把一个对象塞到一个阅读全文
posted @ 2011-10-25 22:55 egmkang 阅读(2202) 评论(8) 编辑
摘要: 相信一些朋友也碰见过这样的面试题目,本文尝试着给出解答.1. 分配对象在堆上 那么,必然要禁止对象在栈上面分配.一个很简单的办法,就是构造函数私有化(提供额外的接口生成对象),那么在栈上面就不可以分配.可是我们还需要这个对象要被析构,那么可以提供一个接口,显式的释放掉这个接口,也就是说delete也得给他禁掉~~~ 考虑另外一个问题,C++有placement new,我自己new一块内存,然后在你这上面构造.问题就变得很恶心,看来我们只有把new,delete都给他禁掉... 好了,我们现在知道该怎么做:createInstance()接口产生对象dispose()接口销毁对象new/...阅读全文
posted @ 2011-10-25 22:40 egmkang 阅读(2294) 评论(0) 编辑
摘要: 网友问了一个问题,说对象A在内部可以修改HP.外部对象只能访问对象A的HP,不能修改.这东西其实可以用__index和__newindex来实现.__index指向对象A,这样就可以访问;__newindex重写,修改hp的话,就禁止.就可以完成他的需求.下面给出简单的代码:function cannotModifyHp(object) local proxy = {} local mt = { __index = object, __newindex = function(t,k,v) if k ~= "hp" then object[k] = v en...阅读全文
posted @ 2011-09-27 14:16 egmkang 阅读(3444) 评论(2) 编辑
摘要: 很大程度上,野指针都是因为编码不善,习惯不好所产生的.要解决野指针,就要养成好习惯,不要动不动就public数据成员,所有的数据访问都抽象成接口,最好只在一个地方delete数据.前段时间游戏技术测试,down机无限,搞的很头疼.后来用valgrind的memcheck工具,找到很多野指针.valgrind很好用,除了有一点慢:-)valgrind --tool=memcheck --leak-check=full --log-file=./log_file.log --showpossibly-lost=no --malloc-fill=0xff --free-fill=0x11 ./exe阅读全文
posted @ 2011-09-26 22:51 egmkang 阅读(5209) 评论(4) 编辑