
C/C++
文章平均质量分 71
华秋实
likeyockie@163.com
展开
-
brpc组件bvar源码解析(四)Sampler、SamplerCollector和Window类簇
1.Sampler类原创 2022-06-01 01:05:19 · 720 阅读 · 1 评论 -
brpc组件bvar源码解析(三)Variable、Reducer和Adder
1.Variable类Variable是所有bvar的基类,是一个纯虚类。拥有的唯一的成员变量是_name。Variable类中的接口分为几类:描述相关的子类实现纯虚函数describe,目的是将bvar的值写入ostream。get_description不是纯虚函数,它调用了describe写入ostringstream,返回ostringstream的string。曝光相关的例如:expose,expose_impl,expose_as,list_exposed,count_ex原创 2022-05-19 17:26:43 · 859 阅读 · 0 评论 -
brpc组件bvar源码解析(二)AgentGroup和AgentCombiner
上一篇:brpc组件bvar源码解析(一)简介、使用和类的关系1.AgentGroupAgentGroup中通过tls数据实际保存了bvar在每个线程中的统计值。AgentGroup类的定义:模板参数Agent实际传入的是AgentCombiner::Agent这个结构体;对于Agent相同的bvar,例如两个bvar::Adder< int >,在AgentGroup中实际的存储空间是同一块buffer,通过AgentId定位(类似一个数组的不同下标)。成员变量都是static的,原创 2022-05-15 23:47:26 · 675 阅读 · 0 评论 -
brpc组件bvar源码解析(一)简介、使用和类的关系
bvar是brpc中的一个重要组件,brpc内部有很多builtin监控都是bvar实现的。brpc文档介绍bvar“几乎不会给程序增加性能开销,也快于竞争频繁的原子操作”。它的原理是:多线程累加一个计数器时,每个线程只累加私有的变量而不参与全局竞争,因此写时没有锁的竞争;在读取时累加所有线程的私有变量。虽然读比之前慢多了,但写就快多了,因此它使用写多读少的场景,例如统计、监控场景。1.使用// bvar::Adder<T>用于累加,下面定义了一个统计read error总数的Adder。原创 2022-05-12 11:08:14 · 1474 阅读 · 0 评论 -
C++20 协程coroutine
#1.协程概念协程函数与普通函数的区别:(1)普通函数执行完返回,则结束。协程函数可以运行到一半,返回并保留上下文;下次唤醒时恢复上下文,可以接着执行。协程与多线程:(1)协程适合IO密集型程序,一个线程可以调度执行成千上万的协程,IO事件不会阻塞线程(2)多线程适合CPU密集型场景,每个线程都负责cpu计算,cpu得到充分利用协程与异步:(1)都是不阻塞线程的编程方式,但是协程是用同步的方式编程、实现异步的目的,比较适合代码编写、阅读和理解(2)异步编程通常使用callback原创 2021-08-04 22:23:46 · 2388 阅读 · 0 评论 -
C++11用户定义字面量
用户定义字面量来看一下下面的程序:C/C++12 lines#include <iostream>long double operator"" _mm(long double x) { return x / 1000; }long double operator"" _m(long double x) { return x; }long double operator"" _km(long double x) { return x * 1000; }int main(){转载 2020-05-20 11:58:08 · 1004 阅读 · 0 评论 -
【cpp-taskflow】源码分析
一、简介cpp-taskflow 源码:https://github.com/cpp-taskflow/cpp-taskflow(后面简称taskflow)taskflow一个写的比较好的基于task有向无环图(DAG)的并行调度的框架,之所以说写的比较好,个人觉得有几点原因:1.是一个兼具学术研究和工业使用的项目,并非一个玩具2.现代C++开发,风格简洁(源码要求编译器支持C++1...原创 2020-02-07 01:07:08 · 10400 阅读 · 4 评论 -
make_pair
【好记性不如烂笔头:在《C++ Templates》看到这个函数,发现正是前段时间写项目程序所要用到的,可惜当时还不知道有这个用法,当时是自己写了个结构体。。】Utilities 由短小精干的类和函数构成,执行最一般性的工作。 这些工具包括: general types 一些重要的C函数 numeric limitsPairsC++标准程序库中凡是“必须返回两转载 2011-11-17 10:32:19 · 63857 阅读 · 3 评论 -
BitSet
【好记性不如烂笔头:在《C++ Templates》一书上看到了这个类,查了一下,觉得非常有用,所以记下来防止以后忘了】有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法。标准库提供了bitset类使得处理位集合更容易一些。要使用bitset类就必须要包含相关的头文件:#include bit转载 2011-11-16 21:14:14 · 806 阅读 · 0 评论 -
n元一维向量向左旋转i个位置
第一篇原创。。 在《编程珠玑》第2章的开头有三个问题,其中的第2个问题,即问题B是这样的: 将一个n元一维向量向左旋转i个位置,例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n元的中间向量在n步内完成该工作,要求仅用几十个额外字节的存储空间、O(n)的时间内完成向量的旋转。 我首先想到的是:将a数组的前i个元素复制到一个临时数原创 2011-11-02 15:52:10 · 1745 阅读 · 0 评论 -
[收集]二叉树和多叉树的非递归算法
一、二叉树的非递归遍历 (本部分转自:http://www.cnblogs.com/MichaelYin/archive/2010/12/23/1915316.html)二叉树的遍历如果使用递归调用基本没什么问题,这里主要是讲如何使用非递归方法实现二叉树的遍历。由于递归调用程序实际上使用了栈来保存方法中的变量值,在非递归遍历的方法中我们需要基于栈的方法。先来看看这个方法转载 2011-11-02 15:43:09 · 3209 阅读 · 0 评论 -
[收集]计算程序的运行时间
一、方法一C++的库函数中,已经给我们提供了这样的方法——clock(),我们可以使用它来计算程序的运行时间,闲话少说了,开门见山: 计算程序运行时间使用的知识点: 1clock_t 2clock() 3CLOCKS_PER_SEC 这些库函数、类型和常量都是定义在ctime库中的。下面就解释一下吧! 1clock_t数据类型,其实,当你打开time.h就知转载 2011-11-04 17:36:04 · 843 阅读 · 0 评论 -
[收集]内存对齐、sizeof、#pragma pack(n)
本文主要包括二个部分:第一部分:重点介绍在VC中,怎么样采用sizeof来求结构的大小,以及容易出现的问题,并给出解决问题的方法,第二部分:总结出VC中sizeof的主要用法。1、 sizeof应用在结构上的情况请看下面的结构:struct MyStruct{double dda1;char dda;int type};对结构MyStru转载 2011-11-25 23:06:06 · 1008 阅读 · 0 评论 -
[收集]unix/mac/dos-windows三种文本文件的格式的行尾区别
在项目程序中,用fgets()读一个文本文件,一行一行的读取,之前测试的所有的文件都没有问题,今天突然拿到一个文件测试时却出问题了,调试发现它并没有一行一行的读,但是用notepad++明明可以看到文件是一行一行的啊,又不是没有回车,纠结一会,发现这个错误的文件是mac格式的,关于unix/mac/dos-windows三种文本文件的格式的行尾区别,以下是搜索到的资料:不同系统间的行尾表示转载 2011-11-09 21:13:29 · 10769 阅读 · 0 评论 -
C++ std::string --- 你可能不知道的一些用法
toupper, tolower地球人都知道 C++ 的 string 没有 toupper ,好在这不是个大问题,因为我们有 STL 算法:#include #include using namespace std;int main(){ string str = "heLLo"; transform(str.begin(), str.end(), str.begin转载 2011-12-02 11:00:16 · 19439 阅读 · 1 评论 -
关联、组合、聚合、依赖关系比较
类之间的关系1. 种类: Generalization(泛化),Dependency(依赖关系)、Association(关联关系)、Aggregation(聚合关系)、Composition(合成关系)。2. 其中Aggregation(聚合关系)、Composition(合成关系)属于Association(关联关系),是特殊的Association关联关系。3. Genera转载 2011-12-07 11:01:38 · 717 阅读 · 0 评论 -
宏定义中的#,##操作符和... and _ _VA_ARGS_ _ - [C/C++]
1.#假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化(stringizing).#incldue #define PSQR(x) printf("the square of" #x "is %d.\n",(x)*(x)转载 2011-12-23 09:43:10 · 1353 阅读 · 0 评论 -
explicit构造函数
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class String {String ( const char* p ); // 用C风格的字符串p作为初始化值//…}String s1 = “hello”; //OK 隐式转换,等价于String s1 = String(“hello”); 但是有转载 2012-02-09 22:57:12 · 497 阅读 · 0 评论 -
计算整数的二进制中包含1的数量
以前写的计算整数的二进制中包含1的数量的函数真是太弱了。。 今天在书上看到的一个简单方法:int fun(int x){ int count = 0; while(x) { count++; x = x&(x-1); } return count;}int main(){ cout<<fun(9999)<<endl; //9999:100111000转载 2012-03-27 22:25:24 · 785 阅读 · 0 评论 -
由(int&)a引发的思考及浮点数在内存中的表示
[转自:http://blog.youkuaiyun.com/borefo/article/details/4620964]今天看到一段代码,如下:请写出它的输出结果#include using namespace std; int main(void) { float a = 1.0f;转载 2012-03-28 08:55:40 · 706 阅读 · 0 评论 -
详解extern "C"
时常在cpp的代码之中看到这样的代码: #ifdef __cplusplus extern "C" { #endif //一段代码 #ifdef __cplusplus } #endif 这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是转载 2012-03-29 20:49:54 · 414 阅读 · 0 评论 -
如何实现类的成员函数创建线程
class CMySocket{ public: DWORD WINAPI WorkThread(LPVOID CompletetionPortID); ...}; 有如上类,在类中某函数想以函数(WorkThread) CreateThread(NULL, 0, WorkThread, ¶m, 0, &ThreadID)) 编译会报错:cannot转载 2012-03-16 12:24:14 · 1796 阅读 · 0 评论 -
如何在vs2008中添加lib 静态库使用
方法1:在cpp文件中 加入 #pragma comment(lib,"XXX.lib")方法2:步骤1:Tools->options->projects and solutions->VC++ directories分别在包含文件,库文件填加了路径(这些路径只告诉编译器怎么找文件,没有说把那里面的文件加入工程,若不设置,编译报错:无法打开***文件) 步骤2:Proj转载 2012-03-17 19:48:10 · 15933 阅读 · 0 评论 -
C++ char *c 与char []的区别
在实习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="abc",前者改变其内容程序是会崩溃的,而后者完全正确。程序演示:测试环境Devc++代码#include using namespace std;main(){ char *c1 = "abc"; char c2[] = "转载 2012-04-04 21:39:18 · 1026 阅读 · 0 评论 -
Sleep(0)
Sleep(n)的作用是让当前线程睡眠n毫秒,以便执行其他线程,如果没有其他线程,那睡眠n毫秒后,继续执行。 而如果n=0,Sleep(0)是指CPU交出当前线程的执行权,让CPU去执行其他线程。也就是放弃当前线程的时间片,转而执行其他线程。 那么,Sleep(0)应该在那种情况下使用? 一般来说,如果当前线程比较耗时比较占CPU资源,可以在结尾处加上Sleep(0),转载 2012-03-20 22:24:30 · 1145 阅读 · 0 评论 -
[收集]ANSI字符与Unicode字符的互相转换
字符的问题真是令人头痛。。ANSI字符是单字节的,Unicode字符是双字节的,VC6.0默认是用ANSI字符的,而后来的7、8默认都是用Unicode字符。。导致字符的问题经常遇到,最好又不要强制类型转换(有时候结果不正确不说,这种转换会导致很多漏洞。。)。这次真是被逼急了,就上网找了点资料总结一下。。单字节字符或者字符串比如说有char*、string、LPCSTR(实际上就是char原创 2012-03-22 10:34:40 · 2703 阅读 · 0 评论 -
逆序字符串中的单词
面试出了一个题,要求逆序字符串中的单词,比如" My Name Is Tom ",原字符串变成“ Tom Is Name My ”,以空格为单词之间的间隔,可能有多个空格,不考虑其他字符,空间复杂度为O(1)。方法:先将原字符串完全逆序,即变成" moT sI emaN yM ",然后再对每个单词进行逆序,代码如下:#include #include using nam原创 2012-04-15 22:13:24 · 2984 阅读 · 2 评论 -
使用QueryPerformanceFrequency、QueryPerformanceCounter精确计时
一、QueryPerformanceFrequency()-基本介绍类型:Win32API原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);作用:返回硬件支持的高精度计数器的频率。返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。 二、QueryPerformanceCounter()-基本转载 2012-06-25 16:18:17 · 3108 阅读 · 0 评论 -
Windows API了解用户是否在使用鼠标或键盘
《编程之美》1.10的最后提到了一个问题,就是windows中什么api能了解用户是否在使用鼠标或键盘,或者发现用户在几秒之内没有鼠标、键盘的输入?网上搜索了一下资料,觉得大概有两种方法:(1)GetInputState函数原型: BOOL GetInputState(VOID);函数功能:该函数确定在当前线程的消息队列中是否有要处理的鼠标,键盘消息.注意事项:返回值指定是否发原创 2012-07-21 16:20:52 · 10980 阅读 · 2 评论 -
“求二进制数中1的个数”
【一】“求二进制数中1的个数”的几种方法转自[http://blog.youkuaiyun.com/justpub/article/details/2292823] 求二进制中1的个数。对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能的高。先来看看样章上给出的几个算法:解法一,每次除二,看是否为奇数,是的话就累计加一,最后这个结果就是二进制转载 2012-07-25 17:31:11 · 2702 阅读 · 0 评论 -
逆转一个整数的二进制表示问题
解法一:这个容易理解。//解法一 #define UNSIGNED_BITS_COUNT 32 unsigned int BitRev3(unsigned int input) { unsigned int ret, i; for(ret = i = 0; i > 1) ret = (ret << 1) | (input & 1)转载 2012-07-26 16:31:57 · 2551 阅读 · 0 评论 -
STL Vector remove()和erase()的使用
STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。例子如下:#include #include #include #include using namespace std;int main(){ vector Numbers; //vector containing numbers转载 2012-08-13 21:29:06 · 96513 阅读 · 2 评论 -
C++中各种类型的成员变量的初始化方法(mark-好)
C++类中各种不同类型成员根据是否static 、是否const类型的初始化方法不尽相同,写代码时经常搞乱,网上搜了一下资料,全部总结一下。一、例子-----------------Test.h----------------------------#pragma onceclass Test{private : int var1;// int var1原创 2012-08-15 11:28:08 · 13599 阅读 · 1 评论 -
求二叉树中结点的最大距离
#include using namespace std;//*************************************//题目:// 求一棵二叉树中距离相差最远的两个结点之间的距离。// // //思路:注意指针声明了一定要赋值,否则会报错。// 方法一:递归法//距离相差最远的两个结点,共有以下两种情况:// (1转载 2012-07-31 11:27:59 · 1519 阅读 · 0 评论 -
判断一个单链表是否有环,如果有,找出环的起始位置
第一种方法是从单链表head开始,每遍历一个,就把那个node放在hashset里,走到下一个的时候,把该node放在hashset里查找,如果有相同的,就表示有环,如果走到单链表最后一个node,在hashset里都没有重复的node,就表示没有环。 这种方法需要O(n)的空间和时间。 第二种方法是设置两个指针指向单链表的head, 然后开始遍历,第一个指针走一步转载 2012-07-31 10:43:45 · 1464 阅读 · 0 评论 -
类的sizeof
1、空类的sizeof是1。空类是指没有成员的类,类中的函数不占空间,除非是虚函数。如: class A { public: A(){} ~A(){} void fun(){}转载 2012-04-02 16:53:47 · 522 阅读 · 0 评论 -
numeric_limits
numeric_limits:numeric_limits::digits是指type的位数。numeric_limits::max() type的最大值。numeric_limits::min() type的最小值在VC中最好用:std::numeric_limits::max)(); //把max用括号括起来避免和windows定义的宏混淆下面代码作转载 2012-09-10 16:43:26 · 1450 阅读 · 0 评论 -
[收集]字符串的全排列和组合
今天学习了一下何海涛博客中的第28题,字符串的排列问题,实际上指的是字符串的全排列问题(排列和全排列还是有区别的吧)。思考并研究了这题之后就考虑了一下不同条件下其他类似的题的解法的编写,两部分来自于何海涛,其他来自于网络,此处做搬运和收集工作。分别从四个方面考虑:一、字符串的全排列(1)若不考虑字符串中有重复字符(即假设字符串中无重复字符)(2)若考虑字符串中有重复字符(即假设字符串中有重转载 2012-09-14 23:26:36 · 7014 阅读 · 1 评论 -
vector resize和reverse区别
reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。再者,两个函数的形式是有区别的,reserve函数之转载 2012-09-18 15:55:00 · 5254 阅读 · 1 评论 -
在父类的构造函数和析构函数中都不能调用纯虚函数
基类中定了纯虚拟函数,派生类中将其实现,但在某些情况下会出现 r6025 runtime error, pure virtual function call 这样的错误。 在基类某个函数中调用该纯虚函数,本意是为了使用多态,1. 在基类的构造函数中调用该函数,此时派生类派生类还未构造成功;2.或是在基类的析构函数中调用该函数,此时派生类以被销毁;转载 2012-09-19 11:33:32 · 3423 阅读 · 0 评论