
C++
文章平均质量分 68
dxgzg
梦想能成为一名linuxC 服务端开发程序员
展开
-
ctime 非线程安全
由一个不起眼的时间获取导致debug了一天代码,自己的个人网站后天配置一根线程完美运行,配置多线程就会报误用了地址,我第一个反应就是难道跨线程进行了操作?一直找自己one loop per thread的结构那里出错了,gdb也上了无法复现,除非是高并发的情况的才能复现出来,gdb最终发现了这个错误的堆栈,就是这个平平无奇的的getGMT,这函数一瞅都是栈上的数据还不是线程安全?博主你是不是不懂C++啊?我第一反应看到这里报错,我也很不理解,按照我自己的理解每根线程都有自己的栈,为啥他有问题呢?因为原创 2022-05-18 16:40:14 · 524 阅读 · 0 评论 -
C++生成随机字符串
最近给自己的网站搞一个相册,随机生成图片名字,生成100W个16位的名字,测试没重复,感觉还不错,生成的数字是均匀分布的cppreference#include <random>#include <iostream>#include <unistd.h>#include <unordered_set>using namespace std;char seed[64] = { '0','1','2','3','4','5','6','7','原创 2021-12-13 20:24:08 · 3411 阅读 · 0 评论 -
C++拷贝/复制一张图片 读写二进制文件
最近发现了自己网站一个bug(早发现了,一直没去深入探索原因),我网站的图标没了,按F12看看图标传过来了吗,发现传过来了。但为啥没显示出来百思不得其解,起初是怀疑图片是二进制文件保存的,所以按正常文件读写是不对的,想了之后决定用sendfile函数(Linux的一个系统函数,也叫零拷贝函数,没用过的同学可以翻翻man手册或者搜搜了解一下)发送二进制文件,对jpg、png来一个判断,然后sendfile直接发送,这样做起来改动是最少的,该完之后确实发现ok了,就放在那里没改了,最近要修改一下网站后台的源码,原创 2021-09-30 10:38:15 · 255752 阅读 · 4 评论 -
decltype用于自定义排序的理解
以前也没怎么写过,就知道跟auto类似,推断类型的,也没怎么用过。也就偶尔写写unordered_map或者set自定义排序的时候会用到,那会也是,有时候用到decltype也不知道为什么要加&或者不加&。今天整好在做我lc的每日一题,又要自定义排序关系,又蒙逼了所以决定研究一下。题目很简单topK问题。不带&,会认为他是一个函数?带了&号才会认为他是一个函数指针所以LC这道题就要带&,来表明是一个函数指针类型。写这道题的时候去stackoverflow原创 2021-05-20 20:51:09 · 315 阅读 · 2 评论 -
C++遇到的黑科技代码
平常看的一些开源代码,遇到了一些黑科技。在总结一下目录1、将数字压缩写入字符串中2、当函数只能接受int32的参数的时候,但我想传int64的值怎么办?3、利用栈空间1、将数字压缩写入字符串中比如int的最大值是2^31次方,好多位阿,我想写在string中,岂不是要这样写?潜意识都会这么写的,那么我们有什么办法只写在前四个字节中吗?当然有了。string s;s = to_string(INT_MAX);用下面的代码,可以清晰看到,把值写到s2的比特位中了,只占用了4个字节.取出他的地址在强原创 2021-05-03 19:36:22 · 253741 阅读 · 0 评论 -
C++ unique_ptr解惑篇
/usr/include/c++/8/bits/unique_ptr.h:79:16: 错误:invalid application of ‘sizeof’ to incomplete typecentos系统g++编译器在使用unique_ptr这个智能指针的时候,偶尔会遇到这个报错了,一直没有细想,一直都是莽撞,左试试右试试,今天终于解惑了,这个原因是当编译器默认生成了析构函数,而你有一个前置声明的类class Test,你没有include “Test.h”因为在想着降低编译时候的依赖,可是原创 2021-02-24 00:07:57 · 1341 阅读 · 2 评论 -
windows上安装gtest、gtest使用和了解实现内部的过程
刚回到实习公司,还没有下发任务,正好公司用的是Google的测试框架,学一学这个框架的使用1.8版本的下载链接最好找一个有msvc下载,不然还要cmake搞一个sln出来,我用cmake没搞出来,就换了个思路搞。然后就可以编译release版本或者debug版本的库出来了。使用上有点麻烦我出现了tr1爆出异常#define_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING 1,这样就可以解决tr1报出异常的错误。还遇到一个问题是线程库的问题,一般我也很少在Windows原创 2021-02-22 16:13:35 · 1425 阅读 · 0 评论 -
C++小笔记——function绑定重载函数、私有继承用的条件
目录包扩展下的sizeofmove为什么快?inline的虚函数function、bind绑定重载函数类中重载函数包扩展下的sizeofsizeof后面紧跟…来表示包中有多少个参数template<typename ...Args>void fun(Args ...args){ cout << sizeof...(Args)<<endl;}move为什么快?如下图所示,copy是要开辟一块新的空间来存贮,而move相当于"偷"把原来指向位置给偷过来,原先原创 2021-02-09 16:51:26 · 380 阅读 · 0 评论 -
内联函数为什么会快?体积为什么会变大?
这种问题在我没有经历过面试的时候一般不会思考的,但后来发现了,想成为一名合格C++程序员一定要知其然知其所以然,万丈高楼平地起、勿在浮沙筑高台。以前过于专注上层东西而忽略编译器做的事情了,慢慢专注底层知识。偶然翻到了以前放在家里的C++编程思想这本书,上面详细的介绍了内联函数,摘自这本书,了解一下内联函数实际的过程。内联函数快在哪里?针对类的非内联函数来说,非内联函数将调用的代码包括对this压栈和执行汇编语句CALL,在某些机器上执行的时间要长。所以非内联函数在这里就会变慢了,这是内联函数快的原因。原创 2021-02-08 21:34:09 · 932 阅读 · 1 评论 -
2021-02-05-C++小笔记-模板模板参数-new出来的对象在堆栈区还是堆区
毕竟要备战暑期实习和秋招了,还是认真记一下C++的知识点吧。目录模板模板参数this指针关于局部变量new出来的是在堆栈区还是堆区vector的emplace_back时间复杂度分析local-static和non-local-static构造函数初始化比赋值快延后处理创建一个对象的初始化顺序模板模板参数开篇来点硬核的东西吧,啥叫模板模板参数,就是模板参数里带个模板参数,这个就是纯写着玩玩的,别没有深究,只是知道有这个黑魔法template<typename T, template<ty原创 2021-02-06 08:51:01 · 867 阅读 · 0 评论 -
C++小笔记-虚函数指针虚函数表
年底了,给自己放了7天假,这7天基本啥也没有学习,今天开始好好学习啦!奋战今年暑期实习、今年秋招。以下都是看侯捷大佬视频总结的目录引用的深入理解继承\组合构造函数谁先调用转换函数malloc的内部实现原理explicitnamespace虚函数指针和虚函数表引用的深入理解引用是啥学C++的都知道,那他和指针有何区别?引用不可以更改指向的对象,引用第一次指定一个对象就一直指向这个内存地址了,指针就可以更改指针对象,指向别的内存,都是指向一块内存地址的,看下图。引用本质上也是指针实现的,但是指针在32位程原创 2021-02-05 10:27:26 · 350 阅读 · 0 评论 -
C++写一个http服务器/web服务器
目录开篇废话正文开篇废话其实这篇文章一直想写,苦于没有时间,想一气呵成写完,在离回家前一天晚上,在上海的小宾馆里面异常兴奋,写一下如何用C++搭建一个简易的http服务器。我相信大部分人都希望渴望一个自己的网站(哪怕在破在破也是自己做的),我当初是就是这么渴望的,记得那是2020年的8月,我查阅的各种资料终于学会了socket,于是迫不及待的写了一个聊天程序,一直在研究如何端口映射。那时候还很傻很天真,来了一个连接就开一根线程,离开就销毁这根线程,那会也知道线程创建和销毁的开销很大,但是一直没有想到其原创 2021-02-02 18:39:49 · 264039 阅读 · 18 评论 -
copy on write手法以及对多线程新的理解
类对象跨线程处理的是十分棘手的,要想清楚一切可能发生死锁的情况加锁的顺序一定要一致,不要出现线程加锁顺序不一致的情况,因为会有死锁的可能发生。伪共享:多根线程在一个缓存行操作,CPU的缓存的缓存行还要和其他缓存行交互,这是一种伪共享参考的链接...原创 2021-01-19 22:19:29 · 431 阅读 · 3 评论 -
C++11读写锁的实现
参考的源码读写锁,一直都有听,也大概知道点原理,一直没有探究内部是如何实现的,正好今天完成了几项大作业,研究一下读写锁实现的原理。读写锁的原理就是,可以多次读,但是写只能一次一次的写入,我参考的源码博控制了写优先,并且读的优先级没我写的这么高。我自己在修改了他的源码,实现的是读优先,并且优先级很高,如果存在大量的读操作,可能会出现写操作线程饥饿的现象。如果在具体的场景中写操作也多,可以修改wait条件来判断优先级。我最近的感悟,如果非必要,一个类的对象不必非要跨线程操作。#include<mu原创 2021-01-08 16:23:04 · 3328 阅读 · 0 评论 -
C++11智能shared_ptr和weak_ptr神兵利器
以前很少使用智能指针,在单线程的情况下,对象的存活周期都好确定,而在多线程中,思考对象存活周期是极其复杂的,以前没觉得,写过和阅读过很多多线程代码,发现跨线程的对象的存活周期是最难确定,很少确定到底在什么地方delete,最近再看muduo网络库这本书,对C++11智能指针又有了新的理解。书中提到shared_ptr相当于强铁丝,weak_ptr相当于细铁丝。这个要怎么理解呢?可以用weak_ptr的lock来判断shared_ptr对象是否还存活,利用lock来判断是否可以进行提升 shared原创 2021-01-08 14:03:42 · 502 阅读 · 0 评论 -
zookeeper的使用及C语言接口函数,以及分布式学习的个人总结
zookeeper我一开始没认出来是动物饲养员的意思,后来看了关于zookeeper取名的文章才知道这个名字的由来下面这段内容摘自《从 Paxos 到 ZooKeeper 》第四章第一节的某段内容,名字由来还挺好玩的哈哈哈Zookeeper 最早起源于雅虎研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。所以,雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业原创 2021-01-06 00:43:39 · 797 阅读 · 11 评论 -
功能强大的protobuf,初识rpc框架
最近在学习分布式系统,学一点皮毛分布式系统,也了解一下分布式系统。目前我对分布式的理解就是一个类似客户端请求调用某个服务,通过zookper知道调用那个服务,目前的zookper还没有学习,相当于假设程序已经知道调用的服务在那台进程/主机上,代码太多了,本文采取伪代码形式,主要是讲清楚protobuf中的作用,rpc框架的思路详解protobufsyntax = "proto3";package fixbug;option cc_generic_services = true;messag原创 2021-01-03 11:36:39 · 718 阅读 · 0 评论 -
C++function和bind绑定类成员函数
定义一个普通的类class Test1{public: void fun(int val){ cout<<"hello world "<<val<<endl; }};开始第一个测试int main(){ Test1 t; function<void(int)> pf = std::bind(&Test1::fun,t,2); pf(4); // return 0;}输出的值是2,说明pf传进去的4并没有什么用,在bin原创 2020-11-22 17:09:29 · 6592 阅读 · 11 评论 -
在muduo网络库学习中学到muduo网络库的小细节和抛开muduo网络本身学会的c++技能——宏函数后面的\,命名的讲究等等
每天学一点点,只有周末有大把的时间。本篇博客重点讲解我不熟练的,而一些muduo库设计的巧妙的东西,如果想学习深入理念这篇博客完全不太适合。等学完muduo之后,最后仿一个muduo出来,再重新架构一下自己的网络库,一个自己写的小网络库我给他取名为Pine1、宏函数的使用首先是日志的宏函数,平常很少接触宏函数,只是知道有这么个东西,但是并没有写过宏函数。\表示的是后面还有语句的,do while是确保程序一定会执行一次,避免漏掉什么函数宏函数的优缺点#define LOG_FATAL(logmsgFo原创 2020-11-15 23:38:12 · 231 阅读 · 0 评论 -
cmake简单的使用及个人的所思所感所悟
最近好多事情要忙,终于通过了科三,大三课也多了起来,还想做一个小型网络库,当作自己练手的项目(目前完成50%,差一个日志类和buffer类),今天简单的学了学cmake,分享给大家,cmake真是太好玩了,今日份快乐,哈哈哈哈!部分源自别人的博客,部分源自自己的所思所感所悟,希望能帮助到您#进入root模式 su -下载安装yum install cmake写一个main.cpp文件,在同目录下新建一个CMakeLists.txt文件#include <iostream>using原创 2020-11-14 21:31:10 · 225 阅读 · 0 评论 -
dup重定向输出到一个网络连接
这篇博客是我介绍linux的一个子集,看完这篇博客还想看看其他linux函数的话可以去我的另一篇博客看一看!博客连接为什么要单独写一篇出来呢?因为我遇到了问题,并且网上也没有相关的博客。标准输出重定向到一个网络连接,我是在《linux高性能服务器编程》这本书看到的。标准输出重定向到一个网络连接原理就是关闭服务器端的输出,这样printf的数据话就自动给客户端(telnet)发送过去了不过书上的例子没有for循环,我加上了for循环,telnet连接的话,并不会显示出hello语句,我感到很奇怪,后来猜测原创 2020-11-07 11:47:37 · 270 阅读 · 0 评论 -
C++11包扩展
c++11的包扩展,记录一下代码吧,采用万能引用。我个人还是觉得能清晰表达代码尽量不要用这么奇奇怪怪的语句吧?今天在github看一个人线程池的demo,发现他的线程池里充满了这些奇奇怪怪的写法,明明是一个普普通通的生产者消费者的模型,搞出来了好多奇奇怪怪的东西,要搞得这么复杂?又重新翻了下effective modern C++学了一下包扩展void fun4() {//fun4要写一个函数的出口 cout << "fun4 stop!" << endl;}template原创 2020-11-04 19:40:32 · 1147 阅读 · 3 评论 -
C++async、future、packaged_task、promise的使用
目录asyncfuturepackaged_task用法1async初学多线程的我天真的以为异步和多线程是一样的,直到我看见了std::async这个处理异步的函数(头文件在future里面),我才知道异步和多线程是不一样的。关于多线程与异步区别生动形象的例子为什么有了多线程还需要异步操作?身为初学的我想到了这个问题在网上百度了没百度到,好在今天读书的时候又找到了自己想要的答案了。首先要注意到开启一根多线程是不能保存返回值,那么聪明的你肯定也想到函数增加一个引用类型参数,不就解决了嘛,代码如下。这样原创 2020-11-03 21:05:29 · 574 阅读 · 0 评论 -
每天一个设计模式——装饰模式(C++实现)
s原创 2020-11-02 16:30:49 · 187 阅读 · 1 评论 -
C++服务器定时器基于LRU算法思想实现定时器遍历插入调整删除时间复杂度都是O(1)
#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <assert.h>#include <unistd.h>#include <errno.h>#include <string.h>#include <fcntl.h>#include &原创 2020-10-29 09:14:46 · 686 阅读 · 2 评论 -
C++参数包
记录一下对参数包的新认识,前置…叫做XX包,后置…叫做包扩展。我对这个包扩展的理解是递归把这个包分解了,而不是扩展,就比如说这个函数void fun(T t,Args… args)下面的return是解出来一个参数给t,解出来一个参数给t,直到剩下最后一个参数的时候调用最上面的函数,如果没有最上面的这个fun是不能运行的。 这个T类型也必须放在函数的开头,如果不是这样会发生未找到匹配函数,这个很好理解。还是拿这个函数来举例子,s传给T,age和grade变成一个参数包,输出完s递归把age分解给T,然后gr原创 2020-09-17 19:28:32 · 1118 阅读 · 2 评论 -
Mysql的下载以及VS下C++连接mysql会遇到的问题的总结
写在开头:好久没有更新博客了,开头记录一下自己的生活,有一个可爱的女朋友,LeetCode刷了快400道题啦,希望明年能找到一份满意的实习,赚点小钱养好自己和女朋友,相信自己,做好自己!如果本篇博客能解答您心中的疑惑,将是我的荣幸之至!本篇博客次要点和重点:次要点:mysql的下载主要介绍下载以及需不需要安装的问题,具体安装可以看我参考的博客,写的非常好!以及mysql一些基本操作(值得不是语法上的),重点:着重介绍VS下C++连接mysql遇到问题Mysql的下载:下载的网址:https://d原创 2020-08-10 20:54:39 · 555 阅读 · 0 评论 -
using和typedef的区别及C++函数什么时候显示初始模板?
这几天在读effective modern C++,为什么有些函数需要显示的模板初始化,众所周知,定义或者声明一个类对象的时候才需要显示的模板初始化,那为什么有些函数需要显示模板初始化?直接搜索为什么显示初始模板,搜不到,查了查资料,了解了如果这个模板参数不涉及到推导,那么就必须要显示的初始化,如template<typename T>void fcn(){//T不涉及到推导,所以必须显示初始化}template<typename T1,typename T2>void原创 2020-06-11 10:34:53 · 202 阅读 · 0 评论 -
LRU缓存机制
力扣146题利用list和map去解决问题,list<pair<int,int>>::iterator记录下标的位置class LRUCache { list<pair<int, int>>l; unordered_map<int,list<pair<int,int>>::iterator>m; int ...原创 2020-04-05 15:16:11 · 154 阅读 · 2 评论 -
C++采用allocator模板仿造string
写在前言:这是一道C++primer第五版第十三章的习题,13.44,都是按自己的感觉写的,如有逻辑错误,请您不吝赐教!再写这个类之前,对allocator这个类模板的destroy函数有许多的困惑,跑去论坛寻求帮助,一些所谓的“牛人”好像是只会打击你的自信或者回答的驴唇不对马嘴,仿佛他们当初学编程一蹴而就的就学会了,说我菜,我确实也知道自己的水平有限,目前也只是一只大二的小菜鸡,还有人劝我转行,...原创 2020-03-11 15:53:48 · 272 阅读 · 0 评论 -
二分查找和牛顿迭代法求函数的根,和求平方根C++实现版
double f(double x) { return x * x * x - 5 * x * x + 10 * x - 80;}const double N = 1e-6;int main() { int num = 1; double l = 0, r = 100; double root = l + (r - l) / 2; double y = f(root); whil...原创 2020-02-06 09:51:40 · 722 阅读 · 0 评论 -
VS中从文本文档txt文件读取中文乱码的解决办法
前言:这几天考完试出了成绩,身为班长又要帮学委算平均绩点分,去年暑假写了一个比较憨憨的算分代码,一个成绩一个成绩输入进去,又进阶进阶了C++。每次考完试都会做一个全班成绩分数的表,但是不会用Excel的计算公式,就自己写了个一键出绩点的程序,读取两个文件,一个文件把人名都复制,一个把成绩都复制存放txt记事本中去。正题:读成绩时,没发生任何乱码,读人名有中文就出现了乱码,别的我也不知道怎么解决,...原创 2020-01-11 19:49:32 · 5908 阅读 · 19 评论 -
VS C++ 2019中const char* 类型的值不能用于初始化char*的解决与理解
解决方法:1、在char *p = “hello”的前面加const2、或者,右键project -> 属性 -> C/C++ -> 语言 -> 符合模式:否为什么加个const就OK了,我个人的理解,就像int &r=3;//编译器是会报错的。因为编译器觉得你可能会修改3这个常量,所以在前面加一个const,变成常引用,常引用不会修改值,所以这样就不会有问题...原创 2020-01-05 20:49:05 · 8043 阅读 · 7 评论 -
C++常引用数组
#include"dxgzg.h"const int N = 3;int main() { int a[N][N]; int t = 0; for (auto& p : a) {//二维数组的初始化 for (auto &q : p) {//两个都是引用 q = t; t++; } } /*int(*r)[3] = a;//绑定a的行头,左边[]代...原创 2019-12-08 21:53:17 · 442 阅读 · 0 评论