随笔分类 - C/C++
摘要:目录变长函数C中变长参数C++中变长参数变长模板变长模板类变长模板函数变长模板高级功能特殊的包扩展方式"sizeof..."计算参数包参数个数模板参数包是模板最后一个参数吗?小结参考 变长函数 C中变长参数 变长函数(variadic function)是指函数参数个数可变。在C中,有两种方式表示可
阅读全文
摘要:顺序一致性 如果只是简单的进行线程间同步数据,而不考虑效率,那么使用原有的原子类型(atomic)即可。因为通常所使用的原子类型,是基于顺序一致性(sequential consistent)的内存模型(memory model)。 什么是内存模型? 通常,内存模型是一种硬件上的概念,表示的是机器指
阅读全文
摘要:日志等级 从zlog帮助文档以及zlog.h源码文件,容易知道zlog默认支持下面几个日志等级(优先级从低到高):DEBUG、INFO、NOTICE、WARN、ERROR、FATAL。 // zlog.h /* 日志消息等级 */ typedef enum { ZLOG_LEVEL_DEBUG =
阅读全文
摘要:MDC MDC在log4j里解释为Mapped Diagnostic Context,其实就是一个键-值对表。一旦设置了,后面库可以帮你自动打印出来,或者成为文件名的一部分。 来看一个例子,来源于test/test_mdc.c // test/test_mdc.c #include <stdio.h
阅读全文
摘要:zc_arraylist的设计思想 zc_arraylist数据结构 C++中有vector来表示动态列表(数组),C中如何实现呢? 通常,我们用这样一个数据结构,来表示一个动态列表: typedef struct { int *array; /* 数组指针 */ int len; /* 长度 */
阅读全文
摘要:zc_hashtable设计思想 哈希表(hash table),又叫散列表,是根据关键字和值(key-value)直接进行访问的数据结构。哈希表可实现O(1)查找时间复杂度,用于频繁查找的场景,能大大提高效率。哈希表通过关键字和一个映射函数hash(key) 计算出对应value,这个映射函数称为
阅读全文
摘要:引入头文件 zlog所有接口都是线程安全的,使用时只需要包含头文件 #include "zlog.h" 初始化和清理 总览 ini zlog_init(const char *confpath); int zlog_reload(const char *confpath); void zlog_fi
阅读全文
摘要:配置文件 zlog是一个通用日志库,基本功能跟专用日志库并没有本质区别。通用日志库,通过配置文件,来简化一些列日志使用和配置,以适应各种不同项目需求。而配置文件承载了这角色,为不同项目需求定制不同的功能,主要包括:把日志打印到哪儿去,用什么格式,如何转档等。 例如,一个完整的配置文件内容如下: #
阅读全文
摘要:编译环境 我的编译环境(WSL1 + VS Code 1.71.0): OS: Linux 4.4.0 GCC: gcc 5.4.0 编译和安装zlog 下载或fork + clone https://github.com/HardySimpson/zlog 比如,这里是下载安装包zlog-late
阅读全文
摘要:zlog是什么? zlog是一个高可靠、高性能、线程安全、灵活、概念清晰的纯C编写的开源日志库。 项目主页:http://hardysimpson.github.io/zlog/ github源码地址:https://github.com/HardySimpson/zlog 参考文档地址:http:
阅读全文
摘要:工厂模式解决什么问题? 在C++中,通常,我们用构造函数创建对象。但这种方式存在几个限制: 没有返回值。构造函数不能返回结构,如果发生错误,调用者无法通过返回NULL指针得知。(不过可以在构造函数内抛出异常) 命名限制。C++要求构造函数名与所在类的名字相同,也就是说,如果我们调用了A类构造函数,那
阅读全文
摘要:观察者模式 观察者模式解决什么问题? 经常看到一些对象调用其他对象的方法:因为实现复杂的任务通常需要几个对象一起合作完成,为了该目标,对象A为了调用对象B的方法,就必须知道对象B的存在及其接口。 最简单的办法是让A.cpp包含(include)B.h,然后直接调用B class方法。但这样做,做A中
阅读全文
摘要:API包装器模式 通常,需要编写基于另一组类的包装器接口,用一个新的、更简洁的API,来隐藏所有底层遗留代码;或者,已经编写了C++ API,但后来需要给特定客户提供纯C接口,但又不想改变原来的代码封装;或者,你的API用的了一个第三方依赖库,你想让客户直接使用此库,但不想将此库直接暴露给客户。 包
阅读全文
摘要:Pimpl惯用法 Pimpl术语,即“pointer to implementation”(指向实现的指针),由Jeff Summer最先引入。该技巧可以避免在头文件中暴露私有细节,是促进API接口和实现保持完全分离的重要机制。 Pimpl并不是严格意义上的设计模式,而是桥接模式的一种特例。 如下图
阅读全文
摘要:单例模式的惯用实现 一直以来,我在C++中是这样实现单例模式的 class Singleton { public: static Singleton& GetInstance() { static Singleton instance; return instance; } private: Sin
阅读全文
摘要:shared_ptr 不能访问一个空智能指针所接管对象的数据成员或函数成员 当不能确定一个智能指针释放已经释放接管的内存时,需要对其进行空指针判断。因为决不能访问一个空智能指针对象的成员(数据成员或函数成员),否则可能会造成程序崩溃。 如果程序异常退出码为139,则有可能是因为访问空智能指针成员。
阅读全文
摘要:找一个进程可用端口号 如果我们想尝试哪个端口号可用,然后监听该端口,该如何处理?比如FTP协议里面有这样一个需求,PASV模式下,Server需要监听本地数据端口,通常是找一个随机端口号进行监听。而且每收到一个客户PASV命令后,就需要提供一个不同的数据端口,这也就是说,不能两个连接同时使用同一个数
阅读全文
摘要:I/O复用简介 传统的编程模型中,要确定某个文件描述符是否发生关心的事件,需要对其进行轮询。一旦要监听的文件描述符数量众多,可能会导致效率很低。 I/O 复用技术能有效减少需要轮询的文件描述符数量,将其缩减至1个,即I/O复用的系统调用本身,同时,程序也能监听多个文件描述符。这对提高程序性能很重要。
阅读全文
摘要:本文汇总一些C/C++工程实践中碰到的编译、调试问题,以便以后碰到类似问题时,能快速定位、解决。 会长期更新。 C/C++编程 1. extra qualification on member 编译时报错,详细报错信息 extra qualification ‘ftp::UserInfo::’ on
阅读全文
摘要:C++11提供chrono库,可以很方便地用于处理日期和时间。 chrono库主要包含3种类型:时间间隔duration、时钟clocks、时间点time point。 duration:记录时间长度 duration 表示一段时间间隔,用来记录时间长度,可以表示几秒、几分钟,或几个小时的时间间隔。
阅读全文