![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++学习
okiwilldoit
这个作者很懒,什么都没留下…
展开
-
Arena内存池简介
一. 什么是内存池?内存池(Memory Pool)是一种内存分配方式,又被称为固定大小区块规划(fixed-size-blocks allocation)。通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。内存池是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点原创 2020-11-25 18:09:31 · 4003 阅读 · 0 评论 -
用反射机制合并两个Protobuf
对于protobuf的合并操作,官方api提供了MergeFrom函数。如:pd1.MergeFrom(pb2),该方法对于非repeated类型,优先使用pb2,对于repeated类型,就是将两个字段的值取并集,并且无法去重。有时无法满足我们的项目需求。我们可以使用protobuf的google::protobuf::Descriptor和google::protobuf::Reflection实现将两个相同类型的pb合并。代码如下:addressbook.proto文件:package zh原创 2020-07-29 09:37:48 · 6447 阅读 · 0 评论 -
C++反射机制的实现
如何通过类的名称字符串来生成类的对象。比如有一个类ClassA,那么如何通过类名称字符串”ClassA”来生成类的对象呢?反射机制就是程序在运行的过程中,可以通过类名称创建对象,并获取类中申明的成员变量和方法。Java中有天然的反射机制,因为Java本身就是半编译语言,很多东西可以在运行时来做,但是c++就不同了。要建立c++的反射机制,就需要登记每个类名与 创建类实例的回调函数 的对应关系。主要用工厂模式和一个的宏注册函数来实现。实现代码如下所示:class_factory.h#include原创 2020-06-11 14:28:27 · 328 阅读 · 0 评论 -
Linux C++线上程序fatal的debug技巧
Segmentation fault(段错误)是由于虚拟内存管理单元的异常所致,而该异常则通常是由于解引用一个未初始化或非法值的指针引起的。 Linux中提供了core dump的功能,使得对这类错误的调试更为容易。一般情况下,linux系统是不允许产生core文件的,因此首先要解除这个限制: ulimit -c unlimited 接下来,运行含segmentation fault的段程序,原创 2016-08-15 17:06:59 · 1039 阅读 · 0 评论 -
Linux进程通信-信号量C++实现
一、什么是信号量为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个进/线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的。信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和释放(即V(信号变量))信息操作。最简单的信号量是只能取0和1的变量,这也是信号量最常见的一种形式,叫原创 2017-10-31 11:29:02 · 3052 阅读 · 2 评论 -
C++智能指针
1. 为什么要有智能指针?我们先来看一个简单的例子:int remodel(string & str, bool flag){ string * ps = new string(str); if (flag) return -1; str = *ps; delete ps; return 0;}当flag=tru...原创 2018-04-24 11:40:43 · 258 阅读 · 0 评论 -
C++ const用法
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。1.const 修饰成员变量 #includeusing namespace std;int main(){ int a1=3; ///non-const data c转载 2015-10-15 14:12:04 · 313 阅读 · 0 评论 -
C++多态实现及原理
#include #include using namespace std;class Person{public: int id_; string name_; //构造函数不能是虚函数 virtual ~Person(){//析构函数可以是虚函数 cout<<"delete Person"<<endl; } virtual void print() = 0;/原创 2016-01-15 15:24:53 · 543 阅读 · 0 评论 -
C++基础知识
struct Demo{ int a; double b; char c;};Demo占用24个字节,每个变量都按照占用字节最大的变量来对齐。double占用8个字节(64位),int本来占4个字节,为了与double对齐,也需要8个字节。char本来占1个字节,也为了对齐,也需要8个字节,所以总共需要24个字节。struct Demo{ int a; do原创 2017-10-19 16:06:34 · 1582 阅读 · 0 评论 -
memcpy和strcpy函数实现
1.memcpy函数函数原型:void *memcpy(void *dest, const void *src, size_t n); 思路:先将void* 转化为char*,然后按位赋值。void* memcpy(void* dest,const void* src,size_t len){ char* dest_char = dest; const char* sr...原创 2018-05-28 14:14:08 · 1167 阅读 · 2 评论 -
用Blade构建glog和gflags小项目
一.Blade介绍Blade 是一个现代构建系统,期望的目标是强大而好用,把程序猿从构建的繁琐中解放出来。Blade主要定位于linux下的大型C++项目,密切配合研发流程。比方单元測试。持续集成,覆盖率统计等。但像unix下的文本过滤程序一样,保持相对的独立性,能够单独执行。眼下重点支持i386/x86_64 Linux,未来能够考虑支持其他的类unix系统。在腾讯公司“台风”云计算...原创 2018-08-27 15:05:53 · 1534 阅读 · 0 评论 -
blade构建protobuf小项目
一.简介google protobuf是一个灵活的、高效的用于序列化数据的协议。相比较XML和JSON格式,protobuf更小、更快、更便捷。google protobuf是跨语言的,并且自带了一个编译器(protoc),只需要用它进行编译,可以编译成Java、python、C++、C#、Go等代码,然后就可以直接使用,不需要再写其他代码,自带有解析的代码。 更详细的介绍见: http...原创 2018-08-27 19:48:35 · 1675 阅读 · 0 评论 -
C++11新特性学习
1. 智能指针参见博文:https://blog.csdn.net/okiwilldoit/article/details/800622202. auto指定符对于变量,指定其类型将从其初始化器自动推导而出。auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推导,可以大大简化我们的编程工作。auto实际上是在编译时对变量进行了类型推导,所以...原创 2018-09-13 17:22:32 · 274 阅读 · 0 评论 -
C++11多线程编程
Linux 程序员都用过 pthread, 但有了 C++11 的 std::thread 以后,你可以在语言层面编写多线程程序了,直接的好处就是多线程程序的可移植性得到了很大的提高。C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是&lt;atomic&gt; ,&lt;thread&gt;,&lt;mutex&gt;,&lt;condition_variable&am原创 2018-09-25 17:22:30 · 527 阅读 · 0 评论 -
Boost无锁队列
在开发接收转发agent时,采用了多线程的生产者-消费者模式,用了加互斥锁的方式来实现线程同步。互斥锁会阻塞线程,所以压测时,效率并不高。所以想起用无锁队列来实现,性能确实提升了。一. 用互斥锁实现单生产者-单消费者#include <string>#include <sstream>#include <list>#include <pthread.h>#include <i原创 2016-03-24 11:42:24 · 11567 阅读 · 0 评论 -
C++实现string类
本文实现一个简单的string类,主要实现构造函数和append函数,以及=运算符。头文件class string{public: string(); string(const string& str); string(const char* str); size_t length() const;//字符串长度 const char* c_str() con原创 2017-10-19 20:18:20 · 305 阅读 · 0 评论 -
C++继承基础
C++中的继承分为三种继承方式: public,protected,private。 继承会导致父类中的成员访问属性发生变化。继承机制中,子类访问父类成员方式 不管什么继承,父类的private成员始终为父类私有。 public继承:父类的public和protected成员在子类中访问属性不变 private继承:父类的public和protected成员在子类中变成private p原创 2017-10-19 11:55:01 · 241 阅读 · 0 评论 -
类的基础知识
建立一个Student类,用头文件的方式建立:#include //.h文件也需要加头,否则编译会出错#include using namespace std;class Student{ public: Student(int,string,char); ~Student();//析构函数没有参数,不能被重载一个类只有一个析构函数 void display(); p原创 2015-04-10 11:05:58 · 456 阅读 · 0 评论 -
类模板
#include using namespace std;/*类模板:对于功能相同而数据类型不同的一些函数,不必定义一个可对任何类型变量进行操作的函数模板,在调用函数时,系统会根据实参的类型,取代函数模板中的类型参数,得到具体的函数*/template //定义类模板class Compare{public: Compare(numType a,numType b) {原创 2015-04-10 16:33:51 · 409 阅读 · 0 评论 -
C++指针学习
1. 指针即地址,指针类型的变量前面要加*,&是取变量的地址 int a,b; int *p1,*p2; a=100;b=10; p1=&a; p2=&b; cout<<*p1<<" "<<*p2<<endl;//*p1是a的实际值 return 0;2. 值传递和引用传递#include using namespace std;/**C++中引用传递的两种方式:*和&原创 2015-04-08 17:36:20 · 587 阅读 · 0 评论 -
vector和list
#include #include #include using namespace std;void PrintVector(vector);//vector类似数组,用[]可以随机访问元素void PrintList(list);//list是一个双链表,不支持随机访问,插入和删除效率高int main(){ vector vecint; list _list; int原创 2015-04-30 14:55:28 · 368 阅读 · 0 评论 -
C++读写文件
#include using namespace std;class WriteReadTxt{public: void ReadTxt(char* file,vector& vec); void WriteTxt(char* file,int maxSize);};void WriteReadTxt::ReadTxt(char* file,vector& vec){ if原创 2015-05-27 17:45:31 · 360 阅读 · 0 评论 -
劫持系统调用
HOOK(劫持) API的思路就是修改原API的入口,使其跳转到我们的假API入口,然后执行我们的假API函数,为什么说是假API函数呢?因为我们的假API,除了函数名称和真实API的名称不一样之外,其它都是相同的,即它们的函数参数和返回值和调用形式都是一样的。下面举例说明如何hook系统调用或者c语言中的库函数。#include #include v原创 2016-01-28 17:28:24 · 941 阅读 · 0 评论 -
linux调试工具gdb初步学习
GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具。一.GDB命令 gdb基本命令列表: 命令详细解释如下: 命令 解释 示例file 文件名>加载被调试的可执行程序文件。因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径。(gdb) fi原创 2016-02-15 11:18:04 · 424 阅读 · 0 评论 -
结构体用于STL容器
结构体用于泛型编程时,要重载小于运算符,STL里的容器都是有默认排序的,STL中的排序都是默认使用小于号来排序。因此,在对结构体排序时,我们就需要重载小于号!struct Currency{ string symbol; int coins; //重载小于号 bool operator <(const Currency &A) const { int com = symbol原创 2015-08-10 14:58:58 · 1456 阅读 · 0 评论 -
Linux多线程及同步
Linux下实现多线程都是用pthread。UNIX以及类UNIX系统中,线程是以轻量级进程的形式实现。在linux内核中,每个线程也拥有独立的task_struct结构,因此,每个线程也拥有自己独立的pid。一个进程中可以包含多个同时运行的线程,这些线程共享了同一个虚拟内存地址空间和系统资源。 1 创建进程时,直接使用系统调用:clone(),fork()也是调用clone()。 2 创原创 2016-03-04 18:25:33 · 741 阅读 · 0 评论 -
倒排索引C++实现
倒排索引原理:根据属性的值来查找记录位置。假设有3篇文章,file1, file2, file3,文件内容如下:file1 (单词1,单词2,单词3,单词4....)file2 (单词a,单词b,单词c,单词d....) file3 (单词1,单词a,单词3,单词d....)那么建立的倒排索引就是这个样子:单词1 (file1,file3) 单词2 (fi原创 2016-05-10 14:24:50 · 5889 阅读 · 3 评论 -
C++泛型编程
泛型编程(Generic Programming)是一种语言机制,通过它可以实现一个标准的容器库。它以独立于任何特定类型的方式编写代码,而模板是泛型编程的基础。(1)定义函数模板(function template)函数模板是一个独立于类型的函数,可以产生函数的特定类型版本。template <typename T>int compare(const T &v1, const T &v2){原创 2016-05-05 15:25:51 · 515 阅读 · 0 评论 -
Linux编程基础——Socket编程
Linux下的Socket编程大体上包括Tcp Socket、Udp Socket即Raw Socket这三种,其中TCP和UDP方式的Socket编程用于编写应用层的socket程序,是我们用得比较多的,而Raw Socket则用得相对较少,不在本文介绍范围之列。TCP Socket基于TCP协议的客户端/服务器程序的一般流程一般如下:它基本上可以分为三个部分原创 2015-08-31 15:23:27 · 505 阅读 · 0 评论 -
C++常用函数
一. 使用strtok函数分割原型:char *strtok(char *s, char *delim); strtok在s中查找包含在delim中的字符并用NULL(‘\0’)来替换,直到找遍整个字符串。 功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。 说明:首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。 strto原创 2016-05-10 11:25:15 · 1019 阅读 · 0 评论 -
结构体
1.创建结构体,访问成员变量#include #include using namespace std;struct Student{ int num; char sex; string name; };int main(){ Student stu; stu.num = 0;//.是成员运算符 stu.sex = 'm'; stu.name= "zhb";原创 2015-04-09 15:23:47 · 393 阅读 · 0 评论