C++经验总结
文章平均质量分 60
看,未来
墨家学徒
展开
-
开发成长之路(6)-- C++从入门到开发(C++知名库:STL入门·空间配置器)
文章目录1、何为“空间配置器”a、为何需要先了解空间配置器b、SGI STL专属空间配置器c、alloc的优势2、alloc全貌a、 C++内存配置操作与释放操作b、析构和构造的基本函数c、空间的配置与释放(alloc)c.1 真·alloc设计奥义c.2 alloc一级配置器源码(截取)c.3 alloc 二级配置器源码(截取)c.4空间配置函数allocatec.5 空间释放函数deallocatec.6 重新填充free lists 函数refillc. 内存池的chunk_alloc()操作1、.原创 2021-05-01 22:22:08 · 1765 阅读 · 5 评论 -
开发成长之路(2)-- C语言从入门到开发(讲明白指针和引用,顺带讲解多文件编程)
文章目录指针和动态内存分配引用&将引用用于结构何时使用引用参数?指针指针和const通过指针返回字符串的函数通过指针返回结构函数指针声明函数指针函数指针用武之地关于指针的一些思考结构体调试链表初识链表单链表单链表实现指针和动态内存分配指针是C语言的基本概念,C语言中指针无处不在。实际上,每种数据类型,都有相应的指向T的指针类型。指针类型变量存放的值,实际上就是内存地址。指针类型有两个最基本的操作:&:取地址操作 *:去引用 (间接引用)操作引用&首先,&不是.原创 2021-04-27 10:21:19 · 4331 阅读 · 24 评论 -
开发成长之路(1)-- C语言从入门到开发(入门篇一)
内容不限于此思维导图文章目录前言·鸡汤环境搭建前言·鸡汤在这个浮华的“名利场”,我挺感谢这几天的冷静期。其实我一直知道自己该干什么,但是总有各种理由推迟,推迟,再推迟。说到底,争。一个“争”字,蒙蔽了双眼,获得了多少,又失去了多少,并不知道。曾经我以为自己在这条路上已经很牛逼了,慢慢的也就开始飘了,心态变了,这也导致我失去了不少的东西。曾经我以为曾经的大佬们已经“作古”,后来慢慢发现,他们只是站在了更高的层次,做出了自己的选择罢了。谁又不是在自己目前所处的信息层面上做出的选择呢,只要努力.原创 2021-04-26 15:31:58 · 4954 阅读 · 32 评论 -
protobuf 的 C++函数使用手册
文章目录使用message类成员变量的访问编码和解码函数使用message类成员变量的访问在生成的.h文件中定义了类成员的访问方法。例如,对于Person类,定义了name、id、email、phone等成员的访问方法。获取成员变量值直接采用使用成员变量名(全部为小写),设置成员变量值,使用在成员变量名前加set_的方法。对于普通成员变量(required和optional)提供has_方法判断变量值是否被设置;提供clear_方法清除设置的变量值。对于string类型,提供多种set_方法,其原创 2021-12-20 16:12:09 · 1494 阅读 · 0 评论 -
protobuf 与 redis 的结合
这是一个很不错的想法。于是我去验证了一下。然后我如愿以偿的失败了。接着我验证了前辈的代码。学习一下前辈代码中的框架,拿来在自己的业务中使用,八年前的代码,还是比较全面的。msg.proto使用的是 PB2,我比较海纳百川,那就用PB2吧(其实就是懒,不想改代码)package cn.vicky.model.seri; message User { required int32 id = 1; // 主键,唯一 required string username = 2; /原创 2021-12-20 15:32:35 · 1516 阅读 · 0 评论 -
【C++】数组插入哈希表
标题内容虽然简单,但是我还是更愿意相信好记性不如烂笔头。unordered_map<int,int[10]>这样就没戏了。可以这样:unordered_map<int,int*>也可以这样:unordered_map<int,vector<int>>作为我个人比较推荐第二种,最喜欢第一种,可惜第一种插不进去,我做了测试:#include<iostream>#include<unordered_map>usin原创 2021-12-17 10:26:55 · 967 阅读 · 0 评论 -
再探 智能指针
使用任何一项工具,都需要承担代价与风险的。1、一个裸的指针不要用两个shared_ptr管理,unique_ptr也是,它们都会认为自己独占这个资源,你等释放的时候试试看。2、用weak_ptr打破循环引用。3、当需要在类的内部接口中,如果需要将this作为智能指针来使用的话,需要用该类派生自enable_shared_from_this。enable_shared_from_this和shared_from_this在构造和析构中是不能使用的,在某些情况下也不能使用,因为构造的时候类还未生成..原创 2021-10-18 10:41:08 · 293 阅读 · 0 评论 -
emplace_back 和 push_back 差别真有那么明显吗?
去试一下呗,网上千篇一律,什么直接再序列尾部直接构造,什么emplace比vector省去一步拷贝。真有提升好多性能呢,其实好好想想怎么给数据库调优,IO调优,架构调优也挺实在呢。我插了一千万个类对象,两个时间都是用5.6~5.8s之间波动,内存稳定在750M,so?(不是我不想高,撑死也就两千多万个插进去内存就崩了)不过换list上来尾插那差距就很明显了哈。之前有朋友说,我测vector和list的尾插只测基本数据类型,我觉得他说的很有道理,于是我加测一下类对象咯。...原创 2021-10-03 14:34:36 · 491 阅读 · 0 评论 -
XXX为什么选择红黑树?
记得被面过这个问题,问的是epoll为什么选择红黑树不选择AVL树。当时脑子有点乱,回答的就有点乱,再整理一下语言吧。1、其实单次插入,二者没什么太大差别。2、删除的时候,红黑树依旧快,不过AVL树就不一定了,因为它要维护那一条路上的平衡,有可能会到log(N)。3、更重要的是,因为AVL是高度平衡的,所以在增删的时候需要调整的概率就变大了。在频繁增删的时候,第三点才是最要命的。跟哈希表对比也被问过,这个就脑子清醒多了:看业务场景,红黑树省内存、且有序。哈希表更快一些。...原创 2021-10-03 09:23:50 · 356 阅读 · 0 评论 -
放弃不切实际的幻想吧,list 就一定比 vector 插的快?
文章目录一段对话尾插数据测试头插数据测试得出结论一段对话如果 list 真那么好,你自己用吗?用啊,我当然用啦。你用的是STL的吗?还是自己写的list?自己写的。为什么不用STL的,是它写的没你好?它是双向链表,我就偶尔用用,自己又不是不会写。尾插数据测试//#include<vector>#include<list>#include<iostream>#include<ctime>using namespace std;.原创 2021-09-30 11:14:36 · 488 阅读 · 0 评论 -
生成1000个不同的随机数
源自我手写跳表的时候,那随机数,其实真要拿我的代码去运行一下,就看出问题了,根本只有第一个数是随机的。那时候有点忙,整个人情绪也不太好,就一直拖到现在了。今天就来做个了断吧!#include<iostream>#include<time.h>int main() { int n = 1000; srand(time(NULL)); //把这个放到循环外面 while (n) { std::cout << rand() % 5 <<原创 2021-09-23 20:01:02 · 1586 阅读 · 0 评论 -
修正:C++编程经验(7):delete之后到底要不要置空?
置空,必须置空。或者就先做个基准测试。原创 2021-09-20 15:05:24 · 781 阅读 · 1 评论 -
再探 set/map
文章目录set篇放码过来set的定义自定义排序函数set的迭代器begin() 、end()是否成功插入元素的检索为何map和set的插入删除效率比其他序列容器高,而且每次insert之后,以前保存的iterator不会失效?为什么 set 的底层不用hash?set.lower_bound(x)/upper_bound(x)有一个结构体,里面有两个字符串,如何在一个set中查找这个结构体?map篇放码过来map的迭代器自定义排序[] 运算符重载函数C++map迭代器的++操作是如何实现的?set和ma.原创 2021-09-16 21:59:44 · 328 阅读 · 0 评论 -
C++编程经验(12):C++11新特性
没有系统学过,所以这篇写的基本都是我接触过的,接触过多少就整理多少吧。有些特性也不知道是不是新的,反正都是我新接触的,用的还挺顺手。语法层面区间迭代range for用过一次我就很喜欢这个特性了,写起来是方便了不少。for(int i:vec){ cout<<i<<endl;}nullptr这是一个空指针类的对象。我们以前把指针置空都是:ptr = NULL;NULL是一个宏定义,数值为0。当然不是说用NULL有什么问题,不过新的规范都出来了,就用新.原创 2021-09-06 11:46:33 · 683 阅读 · 1 评论 -
当类构造与析构的时候...
关于虚函数部分不在这篇再提,上一篇提过了。文章目录什么时候会调用默认构造函数什么时候调用拷贝构造函数?什么时候调用赋值运算符?深拷贝与浅拷贝成员初始化列表的概念,为什么用它会快一些?有哪些情况必须用到成员列表初始化?构造/析构函数的执行顺序继承机制中对象之间如何转换?C++中类成员的访问权限和继承权限问题如何禁止程序自动生成拷贝构造函数?C++中struct和class的区别什么时候会调用默认构造函数1、当不使用任何初始值定义一个类的非静态变量时,会调用该类的默认构造函数。A a;2、当类B含.原创 2021-09-02 20:34:45 · 539 阅读 · 1 评论 -
再探虚函数
Q1:C++的多态如何实现静态多态:也称为编译期间的多态,编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推断出要调用那个函数,如果有对应的函数就调用该函数,否则出现编译错误。重载函数的关键是函数参数列表——也称函数特征标。包括:函数的参数数目和类型,以及参数的排列顺序。所以,重载函数与返回值,参数名无关。以下这种方式的重载是错误的,这要跟C++的编译后的函数名扯上关系了。void print(const char* str,int width);int prin.原创 2021-09-02 16:10:51 · 339 阅读 · 0 评论 -
指针传参真的不会造成持久化修改吗?
当我们使用指针传参的时候,会从实参拷贝一份对象到形参,二者是不同的指针,但是指向同一块地址。如果在被调用函数中对参数指针进行重新指向,则不会影响到调用函数中的实参。但是,如果在没有重新指向的时候,使用内存函数,情况就不一样了:void test(char* str) { cout << &str << endl; memcpy(str, "1234567", 8);}int main() { char* str = new char[10]; cout原创 2021-09-01 21:37:24 · 295 阅读 · 0 评论 -
C++编程经验(11):std::function 和 bind绑定器
文章目录简介std::function可调用对象std::bindstd::placeholders简介在前面C++集群的项目里面大量应用到了绑定器来做解耦操作,那么,绑定器到底是什么呢?有什么玄妙的地方嘞?其实也不是很玄乎,以前写Qt的时候就经常用到绑定,昨天又发现,其实我们一直在用绑定器却不自知,比如说创建线程,将函数指针与它的参数一并传入。std::function在这一篇博客里(C++搭建集群聊天室(八):网络层代码与业务层代码(登录注册)解耦),我写过这样的代码:#include .原创 2021-08-25 10:55:17 · 744 阅读 · 0 评论 -
C++编程经验(10):无锁编程其实没那么玄乎
文章目录atomic演示曾经有个人,问我对无锁队列的实现是怎么想的。我想了一会儿,还是纳闷儿,无锁,也能做消息队列吗?然后他让我回去好好查查。没错,他就是面试官。atomic在有些场景里面,是需要对一些资源进行锁定的。但是有些资源实在是太小了,锁定的粒度也太小了,不免显得上锁解锁倒成了繁琐。比方说:_mlock.lock();count++;_mlock.unlock();CAS,是基于硬件层面的无锁操作,由CPU来保证。演示#include<iostream>#inc.原创 2021-08-24 22:07:46 · 574 阅读 · 0 评论 -
C++编程经验(9):智能指针 -- 裸指针管得了的我要管,裸指针管不了的我更要管!
文章目录智能指针介绍手写智能指针不带引用计数的智能指针升级手写的智能指针智能指针的循环引用问题强智能指针弱智能指针弱智能指针升级为强智能指针多线程访问共享对象智能指针介绍智能指针是存储指向动态分配(堆)对象指针的类。除了能够在适当的时间自动删除指向的对象外,他们的工作机制很像C++的内置指针。智能指针在面对异常的时候格外有用,因为他们能够确保正确的销毁动态分配的对象。他们也可以用于跟踪被多用户共享的动态分配对象。事实上,智能指针能够做的还有很多事情,例如处理线程安全,提供写时复制,确保协议,并且提供.原创 2021-08-24 20:45:53 · 1350 阅读 · 2 评论 -
C++编程经验(8):对象优化,试试?试试就逝世哈哈哈
天天说,new一个对象,但是有想过要如何写出更高效的对象操作代码吗?动手试过吗?这里是一个用来示例的类,代码很简单,稍微瞟一眼就好:#include<iostream>using namespace std;class test {public: test(int a = 10) :ma(a) { cout << "test()" << endl; } ~test() { cout << "~test()" << endl; }.原创 2021-08-21 23:07:32 · 795 阅读 · 18 评论 -
闭关多日,整理一份C++中那些重要又容易忽视的细节
文章目录基础篇喜欢用内联函数吗?头文件与名空间,好用吧!引用返回引用的高效性何时使用引用参数?基础篇喜欢用内联函数吗?内联函数,都知道是什么嘛,就不多解释了,用这个开头,因为它够简单,又有足够的争议性。有的人喜欢用内联函数,有的人不喜欢用,我嘛,无所谓,什么时候想起来就什么时候用,或者在代码审计的时候会去调整一部分函数为内联函数。内联函数是C++为了提高程序运行速度所做的一项改进,让我们深入到函数内部,了解一下内联函数和常规函数的区别。在C当中,是没有inline这个关键字的,C要使用类似的.原创 2021-06-12 09:15:45 · 1568 阅读 · 15 评论 -
拿捏住C字符串,这个烦人程度不亚于指针的小东西
文章目录字符串处理能力能够反映出一个程序员的技术功底基础扫盲篇字符串字面量难度指数:2 | 细节指数:3 | 重要指数:3字符串初始化难度指数:2 | 细节指数:3 | 重要指数:4君不见 size_t 哪里来?strlen 与 sizeof的不同难度指数:2 | 细节指数:4 | 重要指数:3memset函数难度指数:2 | 细节指数:2 | 重要指数:3基本操作函数篇strcmp:比较字符串strcpy:复制字符串strcat:拼接字符串字符串处理能力能够反映出一个程序员的技术功底曾几何时,看到过.原创 2021-06-08 21:31:26 · 1645 阅读 · 14 评论 -
深入浅出C指针,细节之处见真章,拒绝一切无病呻吟!!!
我曾经听过一个笑话,说是有超过七成的人支持高考取消数学。为什么呢?因为数学刷掉的就是这七成的人。我还听过一个事情,叫做指针是非常难学的,非常危险的东西,小白们前往不要碰。不知道这会不会也是一个笑话。为什么要谈指针色变呢?前面写过一篇指针的,反响还不错,但是我个人感觉还是欠缺火候。于是,我又闭关三天,拿出这一篇来。慢慢看,把握不住的地方私信我。原创 2021-06-04 14:55:08 · 2569 阅读 · 33 评论 -
重温C语言,这三十多个细节你把握住了?
文章目录前言基本篇1、编写代码文档难度指数:1颗星 / 细节指数:5颗星 / 重要指数:5颗星C语言相对其他语言的优势难度指数:1颗星 / 细节指数:1颗星 / 重要指数:3颗星C语言为什么不内置输入输出语句?难度指数:2颗星 / 细节指数:4颗星 / 重要指数:3颗星前言好久不见啦朋友们。这些天我去哪里了?可以翻看我上一篇沉思录。我不想再这样水下去了,水的是我自己的青春年华。前天参加了软件设计师考试,说实话,有点emmm,但是我也发现很多基础已经忘得差不多了,这就是传说中的手生了吗?手生到什.原创 2021-06-01 15:19:16 · 16362 阅读 · 79 评论 -
C++编程经验(6):使用C++风格的类型转换
为什么推荐使用C++风格类型转换?不是说别的风格的类型转换机制不好,但是写C++代码的话,既然人家有,那就慢慢的适应嘛,入乡随俗。我们以前写类型转换一般是这样的:(type) expression,而C++引进了四个类型转换的操作符:static_cast const_castdynamic_castreinterpret_cast以前那样写,现在只不过改成这样写:static_cast(expression)举个例子哈:假设你想把一个 int 转换成 double,以便让包含 int原创 2021-08-04 11:03:45 · 607 阅读 · 12 评论 -
C++编程经验(5):vector的遍历删除
关于这个话题,网上有太多的版本了。甚至我自己的博客中也出现了三个版本,以后,以这一篇的版本为准:正式版本void del_vec_foreach(vector<int>& vec,int target) { for (vector<int>::iterator it = vec.begin(); it != vec.end();) { if (*it == target) { it = vec.erase(it); } else { ++it;原创 2021-08-02 19:49:22 · 1665 阅读 · 8 评论 -
C++编程经验(4):不要在构造函数和析构函数中使用虚函数
这个事情呢,其实我们平时也不会去做的,对吧。当然要是做了的话,那也可以做好某些天连夜加班的准备。构造函数中调用虚函数首先构造函数中不能调用虚函数,不是说语法不允许,最重要的原因在于,当有继承的时候,父类会调用到子类的函数,但是此时子类并没有初始化,会导致数据错误,就这一点足已让你不能在构造函数中调用虚函数。在基类的构造过程中,虚函数调用从不会被传递到派生类中。代之的是,派生类对象表现出来的行为好象其本身就是基类型。不规范地说,在基类的构造过程中,虚函数并没有被"构造"。简单的说就是,在子类对象的原创 2021-08-02 11:07:58 · 998 阅读 · 18 评论 -
C++编程经验(3):别让异常逃离虚构函数!!!
C++并不禁止析构函数吐出异常,但它不鼓励你这样做。这是有理由的。考虑以下代码:class Widget{public: ··· ~Widget(){···}};void dosomething(){ std::vector<Widget> v;} //v在这里被自动销毁当vector被销毁,它有责任带走所有的Widget。但是呢,如果在析构过程中,有个异常被抛出,那后面还没被析构的Widget怎么办?好,继续。再被抛出异常,这也不是什么很奇怪的事情,有一就有二嘛。在原创 2021-08-01 19:31:42 · 589 阅读 · 11 评论 -
C++编程经验(2):为虚基类做虚析构函数的必要性
这个要提一下,如果记不住就记住:如果不做虚析构函数,会有内存泄漏解释定义一个基类的指针p,在delete p时,如果基类的析构函数是虚函数,这时只会看p所赋值的对象,如果p赋值的对象是派生类的对象,就会调用派生类的析构函数;如果p赋值的对象是基类的对象,就会调用基类的析构函数,这样就不会造成内存泄露。如果基类的析构函数不是虚函数,在delete p时,调用析构函数时,只会看指针的数据类型,而不会去看赋值的对象,这样就会造成内存泄露。多少学点设计模式就清楚了。#include <iostrea原创 2021-08-01 16:48:47 · 465 阅读 · 0 评论 -
C++编程经验(1):确保对象使用前被初始化
系列开篇:本系列每篇都会很短,以前都是好多篇合在一起,后来发现合在一起不好,看了根本记不住,要查还不知道在哪一篇哪个位置。本文:如题,痛过就知道。写完。原创 2021-08-01 16:39:00 · 271 阅读 · 0 评论 -
C++标准库STL部分代码学习(源码之前,了无秘密)
容器vector咱也不多说,直接上代码,好吧,代码里面说。#include<iostream>using namespace std;#include<memory.h> // alloc是SGI STL的空间配置器template <class T, class Alloc = alloc>class vector{public: // vector的嵌套类型定义,typedef用于提供iterator_traits<I>支持原创 2021-06-19 10:12:54 · 858 阅读 · 1 评论 -
讲通C/C++预编译/条件编译指令 #ifdef,#ifndef,#endif,#define,…
讲清楚C/C++预处理指令#define,#ifdef,#ifndef,#endif…等的妙用,作为阅读redis源码的首战!原创 2020-08-28 08:52:32 · 4396 阅读 · 11 评论 -
char 、char[]、char*、 const char*、string(无效的const char *到XXXX的转化)
好东西,那我自然是要收藏的如果你是因为报那个错来的,那就对了自然要附上自己的使用经验了1、std::string 和QString在网络传输的过程中是不建议配套的,传过去,接到就成乱码了。我因为这个愚蠢而把我们客户端人员坑惨了。2、char* 使用时建议手动分配空间,不然你也不会知道它什么是就给你段错误了,那时候想改就麻烦了,集腋成裘。3、...原创 2020-03-07 00:35:39 · 1537 阅读 · 1 评论