自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 无锁队列编程

线程锁,信号量这些同步方式使用简单,适用范围广。但是效率比较低,性能比较差。所以在一些特定场景,我们还是寻求效率比较高的无锁编程。认识内存屏障(以linux系统为例):编译器屏障: barrier()CPU内存屏障: smp_mb(), smp_rmb(), smp_wmb()例1:单例类以我们代码当中的单例模板类为例,通常都是这种双重检查的写法。但是这里面会有风险:关键字new内部其实大概有几个关键步骤:void* tmp = operator new(sizeof(T)); /

2021-12-15 14:10:11 270

转载 构造对象时加不加括号的区别

https://blog.csdn.net/spaceyqy/article/details/22730939

2021-03-31 19:00:03 157

原创 实现make_index_sequence

在学习std::bind源码时遇到make_index_sequence,没有找到源码。所以自己试着实现如下:template <class T, size_t NewValue>struct append_new_index;template <size_t... _Vals, size_t NewValue>struct append_new_index<std::index_sequence<_Vals...>, NewValue>{

2021-03-22 19:05:49 703

原创 C++11 bind源码分析

以VS2019 bind源码为例分析。再c++11之前有bind1st和bind2nd两个函数。但是有很大局限性。只能绑定一个继承自binary_function的函数。C++11的bind对此做了泛型拓展。可以绑定所有callable object。bind函数的两个重载定义// FUNCTION TEMPLATE bind (implicit return type)template <class _Fx, class... _Types>_NODISCARD inline _Bi

2021-03-20 21:25:21 797

原创 C++导出类修改的潜在风险

C++类的内存存储1. 成员函数的内存存储class ClassA{public: void Test() {}public: int64_t a;};如上定义一个类,定义一个成员函数void Test()和一个成员变量int64_t a。那么sizeof(ClassA)会是多少呢?实测结果是: 88也就是成员变量a占用内存的大小。那么成员函数void Test()在哪存储呢?还有default的构造函数,析构函数,拷贝构造,赋值运算符重载都在哪存储呢?事实上,C++编

2021-03-17 21:23:21 213

原创 函数类型推导

void func123(int& a){ std::cout << __FUNCTION__ << std::endl;}template<class T>void setFunc(T t, int a){ std::cout << typeid(t).name() << std::endl; //std::cout << sizeof(t) << std::endl;

2021-03-16 15:44:22 148

原创 c++11 function源码分析

以VS2019 function源码为例分析。class function:template <class _Fty>class function : public _Get_function_impl<_Fty>::type { // wrapper for callable objectsprivate: using _Mybase = typename _Get_function_impl<_Fty>::type;public: func

2021-03-12 10:53:36 537

原创 从std::string类理解非成员运算符重载

std::string的operator+,operator<<, operator>>均被定义为非成员运算符重载函数。那么为什么这几个运算符重载函数要定义为非成员函数呢?basic_string的operator>>template <class _Elem, class _Traits, class _Alloc>inline basic_istream<_Elem, _Traits>& operator>>(

2021-02-25 13:17:05 311

原创 从源码分析string和vector的内存增长逻辑

std string内存增长逻辑是怎样的?跟std vector有什么异同?各个stl实现版本有不同,这里只举例SGI和VS2019的版本说明。1. vector的内存增长逻辑1)SGI STL版本vector的insert函数源码(此处只摘录出内存申请逻辑相关的代码):template <class T, class Alloc>void vector<T, Alloc>::insert(iterator position, size_type n, const T&a

2021-02-24 19:52:05 171

原创 右值引用使用场景

移动拷贝构造通用引用

2021-02-24 18:52:07 327

原创 c++11的move forward(二)特殊使用规则

通用引用版本和右值引用版本的一些异同比较假定要实现一个person类,并且实现一个设置person name的方法setName。第一种,通用引用版本(对通用引用使用std::forward)class person{public: template<class T> void setName(T&& name) { name_ = std::forward<T>(name); }private: s

2021-02-24 10:36:32 296

原创 C++构造函数中调用构造函数

一个类中存在重载的构造函数,如果在一个构造函数中调用另外一个构造函数,是非常错误的做法。因为一个构造函数构造一个对象,在这个构造函数中调用另外一个构造函数,会构造一个临时的对象。所以两个构造函数的代码执行不属于同一个对象。这就会造成跟我们预期有差别的结果。如果是为了重用代码,可以抽出共用的代码到一个private小函数。或者是用placement new。......

2021-02-22 17:49:29 652

原创 c++11 type_traits类型萃取

一. c++ traits定义type_traits使用模板技术来萃取类型(包含自定义类型和内置类型)的某些特性,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理用来提高效率或者其他。通过type_traits可以实现在编译期计算、查询、判断、转换和选择,增强了泛型编程的能力,也增强了程序的弹性,使得我们在编译期就能做到优化改进甚至排错,能进一步提高代码质量。二.几个栗子http://www.cplusplus.com/reference/type_traits/?kw=ty

2021-02-22 17:09:48 676

原创 c++11的move forward(一)源码分析

remove_reference去除类型的引用,将引用类型转化为非引用类型template <class T>struct remove_reference { using type = T;};// 左值引用特化版本template <class T>struct remove_reference<T&> { using type = T;};// 右值引用特化版本template <class T>stru

2021-02-07 17:37:33 226

转载 _stdcall与_cdel

转自 https://blog.csdn.net/u014338577/article/details/485828471. _cdecl(1). 是C Declaration的缩写,表示C语言默认的函数调用方法,实际上也是C++的默认的函数调用方法。(2). 所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。具体所示:调用方的函数调用->被调用函数的执行->被调用函数的结果返回->调用方清除调整堆栈。(3). 被调用函数无需要求调用者传递多少参数,调用者传递过多或者过

2021-02-07 14:15:43 302

原创 实现一个读优先的读写锁

WriteFirstRWLock.cpp#include <mutex>#include <chrono>#include <thread>#include <iostream>#include <time.h>class WriteFirstRWLock{public: WriteFirstRWLock() : waitWCount_(0), wCount_(0), rCount_(0) {} ~WriteFir

2021-02-05 19:10:38 292

原创 stl中的排序(3) find/find_if

直接上源码:template <class InputIterator, class T>InputIterator find(InputIterator first, InputIterator last, const T& value) { while (first != last && *first != value) ++first; return first;}template <class InputIterator, class Pr

2021-01-30 13:48:03 130

原创 stl中的排序(2) sort/stable_sort

C++中sort和stable_sort的区别sort是快速排序实现,因此是不稳定的;stable_sort是归并排序实现,因此是稳定的;对于相等的元素sort可能改变顺序,stable_sort保证排序后相等的元素次序不变;Compare函数分析源码,确定compare函数的用法sort函数的两个重载:template <class RandomAccessIterator>inline void sort(RandomAccessIterator first, Random

2021-01-27 20:07:45 330

原创 stl中的排序(1) map的排序

本文相关代码摘录自SGI STL的源码。通过分析源码,更能理解stl中排序算法是怎么软件架构的。map的sort源码分析stl_map.h#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class Key, class T, class Compare = less<Key>, class Alloc = alloc>#elsetemplate <class Key, class T, class Compare,

2021-01-26 21:14:10 612

原创 muduo logger库双buffer设计

最近看到muduo logger库的后端双buffer设计,于是与我自己实现的logger库做一些对比。1. 我的实现LogBuffer : const int64_t kSmallBuffer = 1024; const int64_t kLargeBuffer = 4*1024; template <uint64_t BUFFER_SIZE = kSmallBuffer> class LogBuffer { public: LogBuffer() :cur_(buffe

2021-01-25 19:50:41 173

原创 基础数据类型字节长度一览

linux64windows64linux32windows32char8888short16161616int32323232long64323232longlong64646464size_t64643232

2021-01-25 19:02:13 614

原创 double-check单例模式是否线程安全

单例模式总结double-check的单例模式真的安全吗C++11提供的新单例模式

2021-01-23 19:08:12 669 1

原创 内存屏障

内存屏障最近在研究lock free设计的时候,看到了内存屏障的概念。之前虽然也看到过,但是没有深入探究过。所以花了两天的时间好好整理了一下内存屏障的知识。内存屏障:rmb(), wmb(), mb()。很多地方说是防止cpu指令重排。我研究发现其实并不是。在SMP系统中一个数据的存储和操作可能不在一个cpu核上,比如int a 存储在cpu0 cache,但是a++计算运行在cpu1。这就需要cpu0 cache和cpu1 cache之间的数据通信。为了保证在多处理器的环境下cache仍然一致

2021-01-23 13:16:32 150

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除