c++
文章平均质量分 73
brk
[[ -n $tall_rich_handsome ]] || echo no
展开
-
C/C++ 资源自动清理
【函数/语句块 级别的自动清理】方式一.借助类的析构原理class C{public: C(int* ptr): _ptr(ptr) { } virtual ~C() { delete[] _ptr; } private: int* _ptr;}; void func(){ C obj(new int[5])原创 2013-10-15 13:40:50 · 1297 阅读 · 0 评论 -
简单高效uri解析
header:/// @brief 解析形如[protocol://]domain[:port][path][?query_string]的url/// @param[in] url 被解析的url/// @param[out] protocol 解析到的形如 http/https/ftp/... 的协议串(没有默认为http)/// @param[out] domain 解析到的原创 2014-07-16 10:05:18 · 1154 阅读 · 0 评论 -
udp connect偶发失败的问题定位
问题表现程序“重启”的时候偶发性失败,表现在udp connect失败,但是如果成功启动,则程序运行完全正常。 失败时出现coredump,表现为断言失败:(gdb) bt#0 0x00007ff031e28f45 in raise () from/lib64/libc.so.6#1 0x00007ff031e2a340 in abort () from/lib64/l原创 2014-10-10 17:26:22 · 2426 阅读 · 0 评论 -
选择合适的整数运算方法
【简单移位】大家都知道对于整数乘以2的幂可以通过位左移完成,整数除以2的幂可以通过位右移完成。实际上现在的编译很聪明,即使不显式地用移位的方式优化,编译器也会自动帮忙完成优化,不过前提是这个数是2的幂且是常量。 【整数除&求余】整数除法和求模往往成对的出现,如:quotient = dividend / divisor remainder = dividend原创 2014-08-21 22:40:11 · 1051 阅读 · 0 评论 -
慎用string.resize()
string作为stl模块库的一部分,应用非常广泛,但是用的不好的话,会导致性能低下。可能很多人(包括我之前)认为resize操作仅仅只是改变string对象的内部偏移量,实际的情况是:除了改变内部偏移量之外,resize可能伴随内存重分配, 而且还会作填充操作,见帮助文档: 不适当使用resize可能会严重影响性能。见如下代码(修改自某底层库)原创 2014-08-20 10:59:35 · 5517 阅读 · 0 评论 -
写时拷贝惹得祸
【问题表现】hydra cgi底层库取出来的参数不对 【问题定位】1. 确认是否库的问题check out hydra-release_src-3.10.0,拷贝问题参数到单元测试用例,编译运行,表现跟上面贴图一致,确认是库本身的问题。遗憾的是,cgi底层库单元测试本身的用例全都通过。2. 走查源码仔细确认检查,cgi底层库依赖hydra_u原创 2014-08-20 11:24:09 · 617 阅读 · 0 评论 -
gcc实用扩展总结
一. 将语句跟声明放在表达式里面({ 语句、 声明 }) ,可以任意组合声明和语句,但是最后必须是一个语句,表示整个表达式的返回值比如: 二. 局部标签 __label__ end; for (int i = 0; i原创 2014-08-20 10:56:47 · 831 阅读 · 0 评论 -
gcc内建原子操作总结
gcc从4.1.2开始提供__sync_*系列的内建函数,用于提供加减和逻辑运算的原子操作。type是1,2,4或8字节长度的整形。后面的可扩展参数(...)用来指出哪些变量需要memory barrier,因为目前gcc实现的是full barrier(类似于linux kernel 中的mb(),表示这个操作之前的所有内存操作不会被重排序到这个操作之后),所以可以略掉这个参数。在3原创 2014-08-20 10:57:41 · 1474 阅读 · 0 评论 -
gcc初始化顺序问题
【问题】 最近在封装一个底层库的时候遇到诡异的问题,用gcc4.1.2编译的程序一切正常, 用gcc4.8.2编译的程序运行总是coredump。 经过分析后发现是初始化顺序问题,代码如下(经过简化): typedef std::map typeid_t; typeid_t TYPEID; __attrib原创 2014-08-20 10:35:17 · 2163 阅读 · 0 评论 -
linux下如何printf size_t/uint64_t
一. linux下蛋疼的size_t/ssize_t 32位环境下size_t被定义为unsigned int, 64位环境下size_t被定义为unsigned long, 对于一个需要同时运行在32位、64位环境的程序来说,在printf或者LOG size_t的时候会比较纠结,一般采用如下第1、2两种方式:1. 强制类型转换统一转换成unsigned lo原创 2014-08-20 10:51:46 · 11719 阅读 · 1 评论 -
警惕sscanf的使用
sscanf跟scanf类似,只不过sscanf是扫描字符串,而scanf是扫描标准输入,用得好的话会给解析带来极大的便利性,用的不好的话,可能导致程序陷入死循环,进而导致cpu 100%。 案例 可能不会像你预期的一样,得到一个三元组{1, 120, 6}, 而是让你得到无数个三元组: 原原创 2014-08-20 10:56:32 · 2469 阅读 · 0 评论 -
好用的epoll接口封装
/// epoll接口封装/// @file/// @date 2012-02-14 15:21:53/// @version 1.0.0/// @author baozhou(周龄), master@manpage.cn/// @copyright Tencent/// @namespace hydra// Revision: $Id: epoller.h 1519原创 2014-07-16 10:15:17 · 886 阅读 · 0 评论