- 博客(15)
- 收藏
- 关注
原创 accept返回的fd是否继承listen fd的options
<<UNIX Netwok programming>> 7.4The following socket options are inherited by a connected TCP socket from the listening socket: SO_DEBUG,SO_DONTROUTE,SO_KEEPALIVE,SO_LINGER,SO_OOBINLINE,S...
2019-05-03 13:15:22
519
原创 memcpy自定义对象带来的问题
引言c++11前没有右值引用,我们怎么将一个包含资源的临时对象和“将亡值”转移或者交换到自己的变量中呢?我以前的做法是bitwise swap,即将两个对象的内存按位交换。这种做法一直工作得很好,直到最近一段代码在Linux上运行很OK换到windows上就崩溃,我才开始思考这种做法的安全性。出事代码公司代码有个线程调度框架,接口像极了WIN32程序窗口回调函数,通过一个整形MSGID来投递...
2019-04-29 08:38:08
594
原创 c++编译器bug记录
本文档意在记录工作中使用c++编译器(vc++、g++、clang++等)遇到的编译问题,虽然最终迂回解决,但不知其所以然,遂记录文档以便后面有时间思其所以然。1. 禁用拷贝构造函数,非explicit单参构造函数,无法使用=显式初始化1. 编译环境$ gcc --versiongcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)Copyright ...
2019-04-27 22:16:09
303
原创 std::unordered_map如何使用不同类型的Key
std::unordered_map是c++11引入的关联容器,其HashMap特性和std::map的区别且不讨论,我们先看它的find和count方法:iterator find( const Key& key );(1) iterator find( const Key& key, size_t hash );(1) (C++20 起)const_iterator fi...
2019-04-13 13:16:34
1404
原创 rust引用变量定义时类型声明的特殊用法
先看下面2段代码,代码A:let mut a = 12;let b = &mut a;let c = b;*c = 123;println!("{}", b);代码B:let mut a = 12;let b = &mut a;let c: &mut i32 = b;*c = 123;println!("{}", b);唯一区别就是变量c的定...
2019-04-08 08:26:12
582
原创 golang的空标识符理解
我们有时候看到这样的golang代码:import _ "net/http/pprof"或for _, c := range "11234" { log.Println(c)}或var _ io.Reader = (* XXX)(nil) //全局变量或var _ = Suite(&HelloWorldTest{})代码中_很独特的样子:说...
2018-02-04 19:51:59
1053
原创 c++之option模式
引言我们经常在golang代码中看到这样一种惯用法:根据选项option或者配置config创建一个对象,而创建对象的工厂函数CreateXXX的输入参数不是一个大的选项结构体Options,而是Option的变长参数。举个例子:func main() { p := CreatePersion(WithID(123), WithName("tom")) log.Printl
2018-02-03 15:57:19
5330
原创 state-thread代码解读
state-thread是一个使用longjmp实现的N:1协程库,实现了大部分网络IO接口,编写单线程网络程序非常方便,同时保证超高性能。代码结构清晰,代码量小,设计思路一目了然。能想到的缺点可能就是:不支持windows平台,不支持N:M线程+协程方式。后记先挖个坑,有时间了再慢慢补充。
2018-02-03 12:23:51
790
原创 golang实现try-catch-finally机制
面向对象的编程语言往往都会支持语言级别的异常处理,比如c++使用关键字try开始异常语句块, catch捕获异常,throw抛出异常:try { throw 1; throw std::logic_error("user defined exception");} catch (int e) { std::clog std::endl;} catch (const
2018-01-30 23:19:40
4833
2
原创 c++11之运行期获取tuple元素
代码先行// 运行期以索引获取tuple元素// 需支持C++11及以上标准的编译器,VS2017 15.5.x、CodeBlocks 16.01 gcc 7.2// 参考《深入应用C++11:代码优化与工程级应用》p148,祁宇,机械工业出版社,2015年05templatetypename Visit>void VisitTuple(size_t index, std::tuple
2018-01-22 14:10:57
1858
原创 谈一谈c++中的unevaluated operand
谈一谈c++中的unevaluated operand什么是unevaluated operand我们先看2段外文: In some contexts, unevaluated operands appear (5.2.8, 5.3.3, 5.3.7, 7.1.6.2). An unevaluated operand is not evaluated. An unevaluated operan
2017-03-05 13:00:31
1008
原创 从2段已序的数组中查找某一个数的算法
朋友最近面试某公司,被一道笔试题难住,最后被无情pass了。题目大致是:int a[] 由2个已序且范围无交叉的序列组成,比如4,5,6,7,1,2,3,从中查找指定的数。要求时间复杂度小于O(N)。算法思路首先想到的是折半查找,时间复杂度应该为O(log N)。假设数组起始位置为x和y,折半位置为h,2个序列边界为*,查找数的位置为n。数组表示为: |-------
2017-03-03 12:12:34
432
原创 获取一个数的下一个2的指数值
云风写的buddy内存分配器有这样一个函数,实现获取一个数的下一个2的指数值。我还没搞懂原理,先记下来,以后仔细研究研究。 代码如下:static inline intis_pow_of_2(uint32_t x) { return !(x & (x-1));}static inline uint32_tnext_pow_of_2(uint32_t x) { if ( is_pow_o
2017-03-02 09:45:22
446
原创 如何判断一个类型是否重载了输出操作符
需要编译器支持c++14,直接上代码。template<typename T, typename = void>struct IsOverloadOsOperator : std::false_type {};template<typename T>struct IsOverloadOsOperator <T, std::void_t<decltype( *(std::ostream *)nul
2017-03-01 20:45:23
642
原创 sprintf的三个要点
width之误解当使用s格式化字符串时prec可以截取控制字符串的长度widthprec均可用代替在参数列表指定数值函数原型:int sprintf(const char *fmt, …),其中fmt格式为:%[width][.prec][type]width之误解 width为字符的最小长度,如果不够,默认以空格右补齐。很多人误以为是最大长度限制,写出内存写越界的bug。比如: c
2017-03-01 20:40:00
670
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人