C++
一缕阳光a
(1)、从2018年8月开始从事分布式数据库内核开发工作,包括自研分布式分析型数据库OLAP、自研分布式数据库HTAP,根据开源数据库实现本公司集群型的OLTP产品,以及现在正在做的根据opengaussDB开发的HTAP类型数据库。
(2)、乐于专研,对分布式数据库有强烈的兴趣。
个人邮箱: zgaoq@163.com。
展开
-
一定用得到的免费 C++ 资源,值得收藏!
提到C/C++语言很多初学者都觉得,学到中间就进行不下去了,但是如果你最难啃的那几块硬骨头拿下,一切都会顺畅许多,而且C++诞生很久了,因此有大量可以免费阅读编程文档。近日,在Quora上发现一份免费的C++资料列表,涉及到C++的各方各面。如果你对C++感兴趣,不妨继续往下看看看这些资料是不是你正需要的。...转载 2022-07-27 18:55:15 · 380 阅读 · 0 评论 -
多线程的互斥锁应用RAII机制
从输出结果上看,我们的锁是生效的,没有出现错乱。这里的资源可以是文件句柄,内存,Event,互斥量等等,由于系统的资源是有限的,就好比自然界的石油,铁矿一样,不是取之不尽,用之不竭的。在步骤一和步骤二上,我们平时都比较容易把握,而资源的释放会因为种种编码原因容易被忽略,导致系统资源实际没有使用了,但却没有释放或者引发其他问题,影响了系统资源利用率。RAII的做法是使用一个类对象,在对象的构造函数中获取资源,在对象生命期内控制对资源的访问,最后在对象消失时,其析构函数来释放获取的资源;......转载 2022-07-27 17:30:40 · 196 阅读 · 0 评论 -
并发与并行的区别
并发(concurrency)指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。并行在多处理器系统中存在,而并发可以在单处理器和多处理器系统中都存在,并发能够在单处理器系统中存在是因为并发是并行的假象,并行要求程序能够同时执行多个操作,而并发只是要求程序假装同时执行多个操作(每个小时间片执行一个操作,多个操作快速切换执行)。并发是指一个处理器同时处理多个任务。...转载 2022-07-26 17:37:02 · 8491 阅读 · 1 评论 -
普通的int main(){}没有写return 0;会怎么样?
但个人认为这也确实是不好的习惯,mian函数会犯这种错误,其它函数估计也会这样,所以最好所有的带有返回值的函数都添加returnxxx。网站更强大的功能是它支持市面上几乎所有的编译器,而且各个版本都有。得出结论正常一个带有返回值的函数,返回值都会存在某个地方,可能是栈上也可能是寄存器里,如果你不给它返回值,那可能外部获取的返回值就是个奇奇怪怪的值,因为咱也不知道那块地址是什么数据。看我右面红框圈出来的代码,大家可以理解为eax就是main()函数的返回值,这里可以看到main()函数的返回值是0。...转载 2022-07-26 15:37:53 · 1977 阅读 · 0 评论 -
std::map中的lower_bound与upper_bound
最近在工作中遇到了std::map中的lower_bound与upper_bound,再次记录下其功能和使用方式。std::map<char, int> mp;mp.lower_bound<key> : 返回的是小于、等于key的iterator,如果没有则返回第一个元素的iterator。mp.upper_bound<key> :返回的是大于key的iterator,如果没有,则返回空例子如下:// map::lower_bound/upper原创 2022-04-18 13:57:23 · 2849 阅读 · 0 评论 -
invalid use of incomplete type struct 或者是class的解决办法
在写完代码之后进行编译时,提示"invalid use of incomplete type struct" 或者 "invalid use of incomplete type class" 的解决办法:1、对应的头文件要包含,这个是必须的。当时因为没有包含头文件,也汇报上的错误2、编译器不知道所用的是struct 还是class,所以需要引用该struct 或 class的头文件,记住:只要引用了struct 或 class,就需要包含对应的头文件一般就是这2种情况,其他的情况暂未遇到,原创 2022-01-05 20:21:36 · 8013 阅读 · 0 评论 -
在X32与X64下,每种数据类型占用的字节数
在X32与X64下,每种数据类型占用的字节数分别如下: X32 X64指针 4Byte 8Bytechar 1Byte ...原创 2021-12-25 10:34:18 · 990 阅读 · 0 评论 -
在c++中,如果派生类没有重写基类中对应virtual函数会怎样?
在c++中,如果一个派生类没有重写基类中对应的虚函数,那么在派生类的构造函数中依然会创建虚指针,但是该虚指针指向的是基类的虚表。#include <iostream>#include <string>class Base {public: virtual void foo() { std::cout << "Base::foo" << std::endl; }};class Derived : pub原创 2021-12-22 19:47:53 · 1236 阅读 · 0 评论 -
C语言库函数--strstr()
原型:extern char *strstr(const char *str1, const char *str2);需要包含的头文件:#include <string.h>作用:用于判断字符串str2在字符串str1中第一次出现的位置。如果没有找到则返回NULL,找到了则返回str1中的位置。下面的代码为例:ptr_zlib指向"zlib;compression=lz4"的首字符'z'#include <iostream>#include <strin原创 2021-09-24 20:41:14 · 1193 阅读 · 0 评论 -
kmp算法
这个时LeetCode上的一道题,具体的解题思路就不再重复了,网上很多自己查询,代码如下:int kmp(string s, string t) { if (0 == s.size() && 0 == t.size()) { return 0; } else if (0 == s.size() && 0 != t.size()) { return -1; } else if (0 != s.size() && 0 == t.size())原创 2021-09-24 20:39:59 · 140 阅读 · 0 评论 -
std::make_shared<T>/std::make_unique<T>与std::shared_ptr<T>/std::unique_ptr<T>的区别与联系
(1)、std::make_shared<T>与std::make_unique<T>相对于std::shared_ptr<T>/std::unique_ptr<T>只有一次内存的分配(2)、std::make_shared<T>与std::make_unique<T>不会抛出异常;此外,std::make_shared<T>是在C++11中引入的;std::make_unique<T>在C++14中引入的原创 2021-09-18 17:36:10 · 240 阅读 · 0 评论 -
std::unique_ptr<T>与boost::scoped_ptr<T>的特殊性
std::unique_ptr<T>与boost::scoped_ptr<T>的底层实现原理类型,不清楚是谁"借鉴"另一个的实现的,但这不重要。std::unique_ptr<T>与boost::scoped_ptr<T> 都禁用了拷贝构造和赋值函数,所以不能作为STL容器中的元素,要作为STL容器中的元素时,那么进行push_back()时要调用赋值函数,但是他们都禁用了拷贝构造和赋值函数,所以不能作为STL容器中的元素。但是可以有另一种方法,使用s原创 2021-09-18 17:21:59 · 170 阅读 · 0 评论 -
CMakeList.txt中设置一个可变的变量的值(bool)
在CMakeList.txt中有个bool变量,在debug模式下需要设置为OFF,在其他模式(release、thread、leak)下设置为ON,需要在makefile中将该值设置不同的值,CMakeList.txt中增加的代码如下:IF(CMAKE_BUILD_TYPE STREQUAL "DEBUG") SET(DEBUG_OFF OFF)ELSE() SET(DEBUG_OFF ON)## 这个是打印DEBUG_OFF的值用的MESSAGE("DEBUG_OFF=" ${LI原创 2021-07-01 16:44:23 · 2106 阅读 · 0 评论 -
C++类中protected访问权限问题
在c++中,protected修饰的成员属性和成员函数的访问权限:(1)、本类中的成员函数(public/private/protected修饰的函数)(2)、友元函数和友元类(3)、派生类中的成员函数可以访问对应基类中的protected成员属性和成员函数。#include <iostream>#include <string>class Base {public: Base() : m_data(0) {}protected: int原创 2021-05-06 19:48:26 · 2343 阅读 · 0 评论 -
linux下unix timestamp 与 可视化时间/常规时间进行转换
unix timestamp 与 可视化时间/常规时间进行转换。最近工作中需要根据可视化时间得到unix timestamp,完成工作之后记录下来了,防止下次遇到此问题时,又需要重新梳理,直接上代码了:#include <iostream>#include <string>#include <ctime>#include <string.h>void unix_timestamp_2_str(long timestamp, char st原创 2021-04-29 17:45:10 · 637 阅读 · 0 评论 -
vector内存扩容
vector底层实现的机制是一个动态数组,当其占用的内存不足时,就会自动分配时原来内存大小2倍的空间,并将原来内存中的数据拷贝到新开辟的内存中。vector扩容时,并不是在原有内存的基础上再分配一块内存,而是在其他的地方分配是原来内存大小2的空间,并将原来内存中的数据拷贝到新开辟的内存中,最后释放原来的内存。所以不会出现内存重叠的现象。...原创 2021-04-15 17:45:26 · 1054 阅读 · 0 评论 -
大括号之谜:C++的列表初始化语法解析
转载: https://segmentfault.com/a/1190000039362151摘要:有朋友在使用std::array时发现一个奇怪的问题:当元素类型是复合类型时,编译通不过。有朋友在使用std::array时发现一个奇怪的问题:当元素类型是复合类型时,编译通不过。structS{intx;inty;};intmain(){inta1[3]{1,2,3};//简单类型,原生数组std::array<i...转载 2021-04-06 11:27:44 · 696 阅读 · 0 评论 -
C++ std::move()和完美转发
move、forward、模板类型推断分析下面这张图是模板类型推断原则: 总结引用折叠原则和完美转发是有联系的,可以说后者是基于前者的某些特性实现的,具体来看一下。要理解完美转发,需要了解两个知识点: 引用折叠原则(Reference collapsing rules)。 右值函数模版参数类型推导(Template argument deduction) 我们先来分析一下为什么需要使用到move呢?C++11多出来一个move语义,意图是解决临时对象重复..转载 2021-03-26 18:42:00 · 435 阅读 · 0 评论 -
如何让new操作符只构造,不申请内存
问题c++中的new操作符 通常完成两个工作 分配内存及调用相应的构造函数。请问: 如何让new操作符不分配内存,只调用构造函数? 这样的用法有什么用? placement new的含义placement new可以实现不分配内存,只调用构造函数。void*operatornew(size_t,void*p)throw(){returnp;}placement new的执行忽略了size_t参数,只返还第二个参数。其结果是允许用户...转载 2021-01-08 17:39:30 · 496 阅读 · 0 评论 -
彻底理清重载函数匹配
前言前面我们讲到了《什么是函数重载?》,有了函数重载之后,就需要确定某次调用需要选用哪个函数。这个过程可以称之为函数匹配或者重载确定。大多数情况下,我们都很容易能够确定某次调用需要选用哪个函数,但事实上不尽然。但通过本文将彻底理清重载函数匹配匹配过程为便于说明,将函数匹配分为三个阶段,确定候选函数,确定可行函数,确定最佳匹配函数。确定候选函数候选函数也就是和被调用的函数同名,并且其声明在调用点可见。举个简单的例子。假设有两个文件,1.cpp和2.cpp,内容分别如下:1.cpp:转载 2021-01-04 15:56:44 · 140 阅读 · 0 评论 -
C++中的模板展开问题
在c++中使用模板的目的是:减少代码量,相同功能的代码只写一份,根据传入不同的参数,实现相同的功能。优点:减少了程序开发者的工作 量,只写一份相同功能的代码缺点:编译器在展开时,每传入一个参数就会展开一个实例,编译器代替了程序员的一部分工作,但是模板更复杂,增加了难度。其次:在编译时,模板本身是不参加,当做了注释,只有在传入参数时实例化时才检查代码template <typename T>class Singleton {public: stati..原创 2020-12-03 15:58:35 · 1473 阅读 · 0 评论 -
notify_one() 或 notify_all() 在c++中的使用要点
notify_one() 或 notify_all() 如果在锁(mutex spin_lock)里调用,可能会导致被立刻唤醒的线程继续阻塞,因为锁被notify线程持有。c++标准上说,一些实现(尤其是许多 pthread 的实现)为了归避这种情况,在通知调用中,直接将等待线程从条件变量队列转移到互斥队列,而不唤醒它,来避免此"hurry up and wait"--急于求成 的场景官方文档: https://en.cppreference.com/w/cpp/thread/conditi...原创 2020-11-12 15:11:29 · 2167 阅读 · 0 评论 -
C++ 中的 #pragma warning(push) 和 #pragma warning(pop)有什么用
#pragmawarning(push)是保存当前的编译器警告状态;#pragmawarning(pop)是恢复原先的警告状态。例如:rocksdb中的一段代码#if defined(_MSC_VER)#pragma warning(push)#pragma warning(disable : 4244) # 禁止compiler警告#pragmawarning(disable:4705)#pragmawarning(disable:4706)...原创 2020-10-16 19:55:31 · 1474 阅读 · 1 评论 -
为什么auto_ptr智能指针不能作为STL标准容器的元素
上个星期的博客shared_ptr源码剖析里其实遗漏了一个问题:为什么auto_ptr不可以作为STL标准容器的元素,而shared_ptr可以? 我在网上看了好多篇讲shared_ptr的文章里讲到了这个问题,不过大多文章只是简单两笔带过。我研究了一下这个问题,发现还是有挺多有价值的内容,所以把这个问题单独成一篇博客和大家分享。先从表象上看看这个问题,假如有这样的一段代码,是否能够运行?int costa_foo(){ vector< auto_ptr<int>..转载 2020-08-25 19:14:40 · 502 阅读 · 0 评论 -
explicit关键字详解
C++ explicit关键字详解首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:class CxString // 没有使用explicit关键字的类声明, 即默认为隐式声明 { public: char转载 2020-08-13 14:37:24 · 2809 阅读 · 0 评论 -
含有5亿个整数的大文件,如果排序?
给你1个文件bigdata,大小4663M,5亿个数,文件中的数据随机,如下一行一个整数:61963023557681612158020393452095006174677379343122016371712330287901712966901...7005375现在要对这个文件进行排序,怎么搞?内部排序先尝试内排,选2种排序方式: privatefinalint cutoff = 8; public void perform(Comparable[..转载 2020-08-06 14:55:55 · 308 阅读 · 0 评论 -
如何使用单线程处理高并发
单线程相当于一个队列,只能按照顺序执行,如果要实现高并发,可以借助下面的方式:(1)、IO多路复用技术(2)、采用事件驱动模型,基于异步回调来处理事件来原创 2020-08-04 16:23:50 · 1844 阅读 · 0 评论 -
C/C++中的占位符
在C++、c语言中增加了占位符,目的是为了减少内存的使用,但是现在内存已经不是瓶颈了,进而很少用占位符了union V { struct X { unsigned char s1:2; unsigned char s2:3; unsigned char s3:3; } x; unsigned char c;} v;v.c = 100;printf("%d", v.x.s3);分析:十进制100对应的二进制为: 01100100使用了占位符,二进制表示为:s..原创 2020-07-24 11:42:53 · 2811 阅读 · 0 评论 -
C++ functor 仿函数
在C++中,仿函数不是一个函数,是一个类,这个类实现了函数的功能。如果我想实现一个求和的功能:定义一个Sum类,让其中的()函数实现这个功能,代码如下:class Sum {public: Sum() = default; virtual ~Sum() {} int operator()(const vector<int>& nums) { long sum = 0; for (auto& item : nums) {原创 2020-07-24 11:39:31 · 271 阅读 · 0 评论 -
std::string中的反向迭代器rbegin()和rend()
在std::string中,有个接口是rbegin()和rend(),分别表示string字符串的倒数第一个字符和正数第一个字符;rbegin():表示string字符串的倒数第一个字符rend():表示string字符串的正数第一个字符分为普通的iterator和const iterator两种:reverse_iterator rbegin() noexcept;const_reverse_iterator rbegin() const noexcept;#include.原创 2020-06-16 14:30:59 · 4882 阅读 · 0 评论 -
boost::scoped_ptr与std::unique_ptr
boost::scoped_ptr与std::unique_ptr都是类模板,封装了指针两者都禁用了拷贝构造和赋值函数,因此不能作为STL容器中的元素,因为在执行push_back()时需要调用赋值函数。std::unique_ptr实际上与boost::scoped_ptr是等价的,只是std将boost::scoped_ptr拿来名字改为了std::unique_ptr,两者的实现方式是一致的。 boost::scoped_ptr源码如下:template<class T>.原创 2020-06-11 17:51:10 · 1369 阅读 · 0 评论 -
C++排序之stable_sort()的方法
stable_sort()可以对vector的某个成员进行排序,而且可保证相等元素的原本相对次序在排序后保持不变。下面是该函数的实现方法代码:#include <iostream>#include<math.h>#include <string>#include <vector>#include <iterator>#include <algorithm>using namespace std;typede..转载 2020-06-01 19:03:07 · 1683 阅读 · 0 评论 -
在构造函数/析构函数中调用virtual函数带来的影响
在构造函数/析构函数中调用virtual函数,那么调用的一定是本类中的virtual函数。先看一段代码:#include<iostream>class Base {public: Base() { print(); } ~Base() { print(); } virtual void print...原创 2020-05-08 11:06:34 · 393 阅读 · 0 评论 -
c/c++ 前置声明 -- typedef问题
前几天写过前置声明的问题,不过今天写代码时又遇到了同样的问题,不过是一个typedef出来的问题。前置声明的好处很多, 比如能避免头文件互相包含的冲突, 比如有时我们在一个头文件中只需要另一个头文件的某个类型定义, 只需要对它做一下前置声明即可,因为为了相对较小的目的要包含进来一个很大的头文件, 实在有些"不值", 况且这个头文件可能还要被其它很多文件再包含的, 这样代价就更大了.所...原创 2020-04-29 17:46:29 · 1285 阅读 · 0 评论 -
类前置声明的使用
首先我们看这样一个示例程序:以上代码中,类CY中有个CX类型的数据成员,我们需要在CY.h中包含CX.h才能编译通过。所以,我们说这里的CY类依赖CX类,当CX.h修改导致CX对象的大小发生变化时(比如,新增一个数据成员或新增一个方法时), CY.cpp都需要重新编译。这在大型工程中可能会造成巨大的编译成本.有没有办法解决这个问题? 有!使用类前置声明。我们先看看修改之后的代码...转载 2020-04-15 10:44:15 · 1571 阅读 · 1 评论 -
智能指针对比
智能指针对比:(1)、boost::shared_ptr<T> -- 基于引用计数器refcount(原子的)<1>、构造函数中refcount+1,析构函数中refcount-1,当refcount的值减到为0时,该对象就会被销毁。<2>、解决循环引用的问题:与weak_ptr<T>一起使用。weak_ptr<T>只引用不计数。...原创 2020-04-12 19:33:55 · 173 阅读 · 0 评论 -
Boost智能指针——boost::scoped_ptr(使用及原理分析)
简介 boost::scoped_ptr是一个比较简单的智能指针,它能保证在离开作用域之后它所管理对象能被自动释放。下面这个例子将介绍它的使用: 1 #include <iostream> 2 #include <boost/scoped_ptr.hpp> 3 4 using namespace std; 5 6 class Book ...转载 2020-04-12 19:06:21 · 1934 阅读 · 0 评论 -
类中成员的构造顺序与本类的构造函数执行的顺序
#include <iostream>#include <stdio.h>#include <algorithm>#include <vector>#include <thread>using namespace std;class A {public: A() { std::cout <...原创 2020-04-12 18:18:11 · 651 阅读 · 0 评论 -
对std::list<T>的封装
由于工作的原因,需要在线程安全的情况下对std::list<T>进行该list进行访问,因此就简单的封装了下,代码如下:template<typename T>class FreeBufList {public: FreeBufList() {} ~FreeBufList() {} void PushBack(const T& v...原创 2020-04-02 17:56:54 · 398 阅读 · 0 评论 -
vector深拷贝与浅拷贝使用总结
(1)、拷贝构造/赋值函数 --- 深拷贝 int w= 100; int h = 20; vector<int> dataA(w*h ,0Xff); vector<int> dataB = dataA; // copy 构造 int * ptr0 = &dataA[0]; int * ptr1 = &...原创 2020-03-06 16:12:03 · 7249 阅读 · 0 评论