
C/C++
文章平均质量分 78
C/C++
zzhongcy
因为站在了巨人的肩上,所以我看得更远。
当你发现自己的才华撑不起野心时,就请安静下来学习吧
展开
-
Safe C++
【代码】Safe C++转载 2024-09-29 16:55:20 · 565 阅读 · 0 评论 -
一个精妙单例CSingleton的赏析
来看看一个精妙单例:#include <iostream>using namespace std; class CSingleton {public: static int* getInstance();}; int* CSingleton::getInstance(){ static int instance; return &instance;} int main() { *CSingleton::getInstance() = 1; cou转载 2020-10-14 17:45:50 · 330 阅读 · 0 评论 -
UUID详解
想必大家都用过UUID,但是UUID也有可能重复,在某些情况下我们需要注意。最近在网上看了几篇关于说明UUID的文章,这里转载记录一下。1 定义UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,目的是让分布式系统中的所有元素,都有唯一辨识,而不需要通过中央控制端来做辨识指定。由算法机器生成。为保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID转载 2020-05-26 14:14:36 · 3038 阅读 · 0 评论 -
提高C++性能的编程技术笔记:临时对象+测试代码
临时对象会以构造函数和析构函数的形式降低一半的性能。注意情况:类型不匹配:一般情况是指当需要X类型的对象时提供的却是其它类型的对象。编译器需要以某种方式将提供的类型转换成要求的X类型。这一过程可能会产生临时对象。按值传递:创建和销毁临时对象的代价是比较高的。倘若可以,我们应该按指针或者引用来传递对象以避免生成临时对象。按值返回:如果编写的函数是按值返回对象(与引用或者指针相对),就...转载 2019-01-15 16:09:49 · 202 阅读 · 0 评论 -
C++修改入口函数名Main的方法
方法1: 通用// 通过下面这句话将入口函数改成fn.#pragma comment(linker, "/entry:fn")#include <iostream> int fn(void){ std::cout << "Hello world!" << std::endl; return 0;}方法2:VS:项目"属...转载 2019-02-01 13:40:21 · 3899 阅读 · 1 评论 -
main函数执行前、后再执行的代码
一、main结束 不代表整个进程结束 (1)全局对象的构造函数会在main 函数之前执行, 全局对象的析构函数会在main函数之后执行; 用atexit注册的函数也会在main之后执行。 (2)一些全局变量、对象和静态变量、对象的空间分配和赋初值就是在执行main函数之前,而main函数执行完后,还要去执行一些诸如释放空间、释放资源使用权等操作 ...转载 2019-02-01 13:49:06 · 1407 阅读 · 0 评论 -
for_each示例
void myfun1(int& i){ std::cout << i << " ";} void myfun2(int i, const char* prefix){ std::cout << prefix << i << std::endl;} struct mystruct1 { ..转载 2019-02-01 13:57:27 · 311 阅读 · 0 评论 -
mem_fun_t/ptr_fun等用法
1、mem_fun_t1-用于遍历调用多态的虚函数,容器元素是指针 2-const_mem_fun:用于const的成员函数,用法类似std::vector<B*> V;V.push_back(new D1);V.push_back(new D2);V.push_back(new D2);V.push_back(new D1); std::for...转载 2019-02-01 14:44:20 · 826 阅读 · 0 评论 -
【Boost】boost库asio详解1——strand与io_service区别
namespace{ // strand提供串行执行, 能够保证线程安全, 同时被post或dispatch的方法, 不会被并发的执行. // io_service不能保证线程安全 boost::asio::io_service m_service; boost::asio::strand m_strand(m_service); boost::...转载 2019-02-01 14:57:12 · 2795 阅读 · 1 评论 -
C++项目中的extern "C" {}
有点遗忘了,这里记录一下,-_-引言在用C++的项目源码中,经常会不可避免的会看到下面的代码:#ifdef __cplusplusextern "C" {#endif/*...*/#ifdef __cplusplus}#endif它到底有什么用呢,你知道吗?而且这样的问题经常会出现在面试or笔试中。下面我就从以下几个方面来介绍它:1、#ifdef _cplusp...转载 2019-01-30 11:22:01 · 1228 阅读 · 0 评论 -
Lex+YACC or Flex+Bison
1.简介 只要你在Unix环境中写过程序,你必定会邂逅神秘的Lex&YACC,就如GNU/Linux用户所熟知的Flex&Bison,这里的Flex就是由Vern Paxon实现的一个Lex,Bison则是GNU版本的YACC. 在此我们将统一称呼这些程序为Lex和YACC.新版本的程序是向上兼容的(译注:即兼容老版本),所以你可以用Flex和Bis...转载 2019-01-07 14:39:03 · 3351 阅读 · 0 评论 -
Linux中getopt函数、optind等变量使用详解
最近在学习《Unix网络编程》vol2时,发现书中例子经常使用一个命令行解析getopt函数,因为函数声明比较特别,根据自己摸索,遂总结出使用方法。1. getopt函数的声明该函数是由Unix标准库提供的函数,查看命令man 3 getopt#include <unistd.h>int getopt(int argc, char * const argv[], con...转载 2019-01-07 13:34:22 · 12366 阅读 · 1 评论 -
开源C/C++网络库比较:ACE、livevent、mongoose和Boost
这几天一直在做linux大批量数据的解决方案,不断的深入了解了一下aio,epoll,libevent,boost::asio。以前只知道他们都是做异步/非阻塞的,但是具体解决的问题的关键点是什么,通过这几天的深入了解,把他们总结一下: aio是linux2.6以后内核实现的异步IO,或者说他才是真正意义上的异步IO。 epoll作为select的linux的替代品,解决了select...转载 2019-01-02 14:02:33 · 4979 阅读 · 0 评论 -
浅尝boost之format
概述 std::string是个很不错的东东,但实际使用时基本在每个程序里都会遇到不愉快的事情:格式化字符串。我甚至由于这个原因在代码里引入平台有关的MFC,ATL等本来不需要在项目中使用的一些重量级的框架,就为了能轻松的做格式化字符串 :-) 。曾尝试过将ATL::CString的format函数提取出来使用,但ATL::CString的底层调用了windows独有函数,无法跨越平台...转载 2018-12-19 13:36:26 · 715 阅读 · 0 评论 -
boost::bind 详解
https://zh.cppreference.com/w/cpp/utility/functional/bindhttps://thispointer.com/c11-lambda-how-to-capture-local-variables-inside-lambda/http://www.xumenger.com/cpp-boost-bind-function-20180612/...转载 2018-12-19 14:38:34 · 3328 阅读 · 0 评论 -
自定义结构体作为map的key
自定义结构体作为C/C++中的map,或是unordered_map的key值:/** * self defined struct as the key of map in c++ */struct K { int n1, n2; K(int i, int j): n1(i), n2(j) {} // the operator < defines the ...转载 2018-12-19 16:19:08 · 5879 阅读 · 0 评论 -
神奇的__attribute__
__attribute__是GNU C特色之一,在iOS用的比较广泛。如果你没有用过,那系统库你总用过,在Foundation.framework中有很多地方用到__attribute__特性。__attribute__ 可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute )。接下来就...转载 2018-12-19 16:23:39 · 3350 阅读 · 0 评论 -
boost中asio多线程模型,以及asio网络库多线程并发处理实现
Boost.Asio 有两种支持多线程的方式,第一种方式比较简单:在多线程的场景下,每个线程都持有一个io_service,并且每个线程都调用各自的io_service的run()方法。 另一种支持多线程的方式:全局只分配一个io_service,并且让这个io_service在多个线程之间共享,每个线程都调用全局的io_service的run()方法。每个线程一个 I/O S...转载 2018-12-21 15:37:32 · 9232 阅读 · 0 评论 -
如何 create nginx module
第三方nginx module:https://www.nginx.com/resources/wiki/modules/http://tengine.taobao.org/book/chapter_03.htmlhttps://www.airpair.com/nginx/extending-nginx-tutorialhttps://github.com/wujunze/ngin...转载 2018-12-21 17:42:11 · 328 阅读 · 0 评论 -
多线程下变量-原子操作 __sync_fetch_and_add等等
最近编码需要实现多线程环境下的计数器操作,统计相关事件的次数。下面是一些学习心得和体会。不敢妄称原创,基本是学习笔记。遇到相关的引用,我会致谢。 当然我们知道,count++这种操作不是原子的。一个自加操作,本质是分成三步的: 1 从缓存取到寄存器 2 在寄存器加1 3 存入缓存。 由于时序的因素,多个线程操作同一个全局变量,会出现问题。这也是并发编程...转载 2018-12-17 16:00:29 · 512 阅读 · 0 评论 -
C++之RAII技术解析
RAII 是 Resource Acquisition Is Initialization(资源获取即初始化)的缩写。RAII 是C++ 中常用的一种编程技术,具体是指必须在使用前获取的资源(如栈内存,线程,文件,锁,数据库连接,磁盘空间)的声明周期绑定在一个对象的生命周期,这样使用者就不需要自己去释放资源,避免资源泄露。 RAII 保证资源可用于任何会访问该对象的函数。它亦保证所...转载 2018-12-24 09:54:54 · 1585 阅读 · 0 评论 -
C++的RVO返回值优化(Return Value Optimization)
最近打算优化新项目的一个函数返回方式,最后发现有一个“C++ RVO”优化,网上查了查资料,自己学习了,在这里记录一下。前言 大家都知道“过早的优化是万恶之源”这句话,然而我相信其中的大多数人都不知道自己是不是在做过早的优化。我也无法准确的定义什么叫做“过早的优化”,但我相信这“过早的优化”要么是得不偿失的,要么干脆是有害无利的。今天我就想举个我认为是“过早的优化”的...转载 2019-02-18 15:16:17 · 1650 阅读 · 0 评论 -
C++学习 boost::optional详解
最近接触到boost::optional,网上查了查,这里学习记录一下!optional: optional库使用"容器"语义,包装了"可能产生无效值"的对象,实现了"未初始化"的概念.#include <boost/optional.hpp>using namespace boost;"无意义"的值: 函数并不总能返回有效的返回值,很多时候函...转载 2019-02-18 15:46:15 · 17031 阅读 · 1 评论 -
boost::lexical_cast 的使用
1,字符串 到 数值类型的转换2,数值 到 字符串的转换3,异常处理情况4,boost::lexical_cast 的原型:template<typename Target, typename Source> Target lexical_cast(Source arg);lexical_cast 是依赖于字符串流 std::stringstream ...转载 2019-02-18 17:37:52 · 1160 阅读 · 0 评论 -
gcc 优化选项 -O1 -O2 -O3 -Os 优先级
Gcc编译优化简介 gcc提供了为了满足用户不同程度的的优化需要,提供了近百种优化选项,用来对{编译时间,目标文件长度,执行效率}这个三维模型进行不同的取舍和平衡。优化的方法不一而足,总体上将有以下几类:1)精简操作指令; 2)尽量满足cpu的流水操作; 3)通过对程序行为地猜测,重新调整代码的执行顺序; 4)充分使用寄存器; 5)对简单的调用进行展开等等。...转载 2019-06-11 16:32:33 · 8329 阅读 · 0 评论 -
boost spirit ——编译器,语法解析器
Spirit 是什么 简单来说,Spirit 是一个 parser generator,功能与 Yacc,ANTLR 类似,且也是基于 EBNF 来描述文法,再基于文法生成 parser,但与前面这些工具相比,它最大的不同点在于它使用了 C++ 代码来对文法进行描述,通过非常残暴的模板编程技巧,在编译阶段就生成了相应的 parser。从使用者的角度来看,文法是用代码进行描述的,因此...转载 2019-05-29 18:07:02 · 3763 阅读 · 0 评论 -
Google Test(GTest) protect保护/私有private属性代码测试技术
对于算法项目,基本都是被调用方,像mlr是以动态链接库的形式被isearch调用,那mlr模块暴露的公共接口是针对isearch,但对mlr的测试不仅仅是靠这些公共接口就够的,因为其本身的很多逻辑都是在私有的,这就需要我们有时候对其私有方法和成员进行测试。 下面有几种打开私有成员和方法的一些办法:1.加宏编译 即在你需要打开私有的头文件中加入#defin...转载 2019-06-12 16:15:29 · 5425 阅读 · 0 评论 -
C++头文件中定义static/const
温故知新! 网上查看到这篇文章,终结的很好,自己也修改了,这里记录一下:背景 看到一个头文件,是专门定义各种常量的,有一天发现这里的常量定义既使用了static,又使用了const,这个文件没有类,全部都是字符串的定义// QVNDefine.h#ifndef QVNDefine_h#define QVNDefine_hconst string VN_LIST =...转载 2019-05-10 17:31:27 · 7228 阅读 · 0 评论 -
protobuf中\0结尾的string数据丢失的问题
首先定义一个protobuf结构,如下:message Person { required int32 mid = 1; required int32 type = 2;}再来看下这段代码,看似没有问题:Person psn0;psn0.set_mid(1);psn0.set_type(0);string str0;psn0.SerializeToStrin...转载 2019-05-10 14:28:25 · 3424 阅读 · 5 评论 -
CentOS/RHEL 开发环境之 devtoolset
前言 CentOS/RHEL Linux 发行版以稳定性著称,所有的软件都要尽可能 stable,导致的一个结果就是基础软件的版本非常的低,比如 CentOS 6.7(15年发布) 中 gcc 版本还是 4.4.7(12年的版本)。这对开发来说就不是很友好,比如我们想用 C++ 11 中的某个特性,就必须自己编译一个高版本的 gcc 出来,但是这会有另外一个问题,开发环境不好维...转载 2019-05-08 14:18:22 · 20466 阅读 · 0 评论 -
libev+nanomsg实现多线程通信及事件轮询实例demo
概述:在我们刚接触程序编码的时候,我们要轮询数据有没有发过来,我们最多的可能还是使用while+sleep这样的组合,这对于处理来说是一个效率很低的方法同时还消耗cpu,那么在多线程编程中使用libev+nanomsg会不会提高效率呢。下面实例主要工作如下:A B C 三个线程通过nanomsg通信,A线程作为主线程,控制中枢,B C请求均通过A.那么在实际应用中,比如B模块是接收...转载 2019-04-19 15:21:27 · 2991 阅读 · 0 评论 -
c++数组的引用
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名; 引用最大的好处就是提高函数效率以及节省空间;关键问题一、传递引用与传指针、传值的区别?值传递 (pass by value),指针传递(pass by pointer),当发生函数调用时,需要给形参分配存储单元、当传递是对...转载 2019-04-04 17:41:31 · 4638 阅读 · 3 评论 -
编译器:LLVM、Clang、GCC
LLVM 是Low Level Virtual Machine的简称。这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。可以作为多种语言编译器的后台来使用。Clang 是一个C++编写的基于LLVM、发布于LLVM BSD许可证下的C/C++/Object-C/Object-C++ 编译器。 Clang:是一...转载 2019-03-05 17:45:04 · 2213 阅读 · 0 评论 -
详解boost库中的Message Queue
Message Queue(后文简写成MQ或消息队列)是boost库中用来封装进程间通信的一种实现,同一台机器上的进程或线程可以通过消息队列来进行通迅。消息队列中的消息由优先级、消息长度、消息数据三部分组成。这里需要注意的事,MQ只是简单的将要发送的数据在内存中进行拷贝,所以我们在发送复杂结构或对象时,我们需要将其序列化后再发送,接收端接收时要反序列化,也就是说我们要自己去定义区分一条...转载 2019-05-05 11:36:27 · 5192 阅读 · 0 评论 -
boost::function和boost::bind
http://www.xumenger.com/cpp-boost-bind-function-20180612/boost::functionboost::function是一个函数包装器,也即一个函数模板,可以用来代替拥有相同返回类型,相同参数类型,以及相同参数个数的各个不同的函数#include<boost/function.hpp>#include<ios...转载 2019-02-28 11:05:11 · 4917 阅读 · 0 评论 -
写时拷贝(copy-on-write) COW技术
一、写时拷贝的概念——COW技术在Linux进程上的应用 Linux在使用fork()函数进程创建时,传统fork()的做法是系统把所有的资源复制给新创建的进程,这种方式不仅单一,而且效率低下。因为所拷贝的数据或别的资源可能是可以共享的。现在Linux的fork()使用写时拷贝页来实现新进程的创建,它是一种可推迟甚至避免数据拷贝的技术,刚开始时内核并不会复制整个地址空间,而是让父子进...转载 2019-02-28 12:15:58 · 2229 阅读 · 0 评论 -
用 snprintf / asprintf 取代不安全的 sprintf
在 C 語言裡,要建立一個字元陣列的字串,常常會使用 sprintf() 這個函數來做格式化的處理。但是實際上,這個函式卻不是那麼「安全」。怎麼說呢?sprintf() 的整個介面長的樣子的是:int sprintf ( char * str, const char * format, ... )也就是在使用前,必須要先建立好一個字元陣列的空間,再用這個函式把內容填入,下面就是簡單的例转载 2014-12-18 16:10:33 · 1828 阅读 · 0 评论 -
C/C++ 运算符优先级列表
PrecedenceOperatorDescriptionExampleAssociativity1()[]->.::++--Grouping operatorArray accessMember access from a pointerMember access from an objectScoping operat转载 2015-01-31 10:55:38 · 1187 阅读 · 0 评论 -
用 char*作为std::map中的key
声明map时需要添加一个cmp比较函数,不然map在比较时,使用char *的指针进行比较,而不是比较char字符串。#include struct cmp_str{ bool operator()(char const *a, char const *b) { return std::strcmp(a, b) < 0; }};int m原创 2014-12-24 09:10:11 · 9328 阅读 · 1 评论 -
#pragma pack引起 stl的map/list在insert时报错:(Suspended : Signal : SIGSEGV:Segmentation fault)
最近接手一个老项目,在老项目中使用了map存储缓存数据,如下:#include "conf.h"int Frame ::parse(){ std::map tmpString; tmpString.insert(std::map::value_type(string("0000"), 12123323)); tmpString.insert(std::map::value_type(原创 2014-12-24 16:25:19 · 6315 阅读 · 0 评论