自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

姜的理想国

大风起兮云飞扬,威加海内兮归故乡,安得猛士兮守四方!

  • 博客(85)
  • 收藏
  • 关注

原创 一文读懂C++20 新特性之module(模块)

C++20中新增了“模块(module)”的概念,用以解决传统的头文件在编译时间及程序组织上的问题。

2022-10-28 09:15:38 7340 1

原创 一文读懂C++20新特性之概念、约束(concept, constraint)

C++20 新特性 概念和约束 concept,constraint, requires

2022-10-19 09:11:07 2252

原创 C++14 make_index_sequence的实现原理(简单明了)

std::make_inedex_sequence<N>的作用是产生一个0,1,2,3,....,N-1的数列。我在STL源码中没有找到实现,所以参考网上的资料,尝试着给出一份自己理解的实现。template<size_t... Args>struct index_sequence{};template<size_t N, size_t... M>struct make_index_sequence : public make_index_sequence&

2022-04-24 10:17:26 2914

原创 C++11模板隐式实例化、显式实例化声明、定义(简单易懂)

1. 隐式实例化在代码中实际使用模板类构造对象或者调用模板函数时,编译器会根据调用者传给模板的实参进行模板类型推导然后对模板进行实例化,此过程中的实例化即是隐式实例化。template<typename T>T add(T t1, T2){ return t1 + t2;}template<typename T>class Dylan{public: T m_data;};int main(){ int ret = add(3

2022-04-23 14:01:31 4862

原创 C++数组名和指针的区别

数组名是个地址常量,指向数组首元素的地址:char attr[10];对于上面的数组,attr == &attr == &attr[0], 都等于这个数组首元素的地址。sizeof(attr)是整个数组的长度。当attr作为函数参数的时候或者用attr来访问数组内元素的时候,会进行隐式转换,转换为指针常量,并指向数组首地址(其实当需要执行这段程序时,相应的数据会被加载到内存,此时内存会保留一份这样的指针常量),当访问数组元素时,就是在指针常量的基础上进行偏移。char

2022-03-21 11:38:48 1495

原创 零长度数组创建可变结构体

在阅读代码的时候发现,发现有的结构体末尾为附加一个0长度或者1长度的数组。其实这是一个小技巧,用这种方法可以实现变长结构体。变长结构体通常在网络通信中的报文头中比较常见。struct Extra{ int m_ext;};struct Header{ int m_data; int m_size; char extra[0];};如上所示,struct Header的最后一个字段是长度为零的char类型数组。这个数组有什么用呢?实际上它被用来表示一个地址,这个地址指向Header

2022-03-21 11:09:04 280

原创 C++ atexit

(C++11 前)int atexit( /*c-atexit-handler*/* func );int atexit( /*atexit-handler*/* func );(C++11 起)int atexit( /*c-atexit-handler*/* func ) noexcept;int atexit( /*atexit-handler*/* func ) noexcept;若执行成功,返回0,否则返回非0.当程序正常终止(调用exit()或者由main函数返回)时,.

2022-03-01 16:10:12 647

原创 C++模板类中的成员函数以及模板函数在类外定义的方式

如下模板类:template<typename T1>class Base{public: Base(T1 t1); T1 GetNum(); template<typename T2> void show(T2 t2);private: T1 num;};构造函数类外定义:template<typname T1>Base<T1>::Base(T1 t) //注意是Base<T1>{

2022-02-27 11:30:56 2066 1

转载 C++中的explicit关键字

C++中的关键字explicit主要是用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。类构造函数默认情况下声明为隐式的即implicit。 隐式转换即是可以由单个实参来调用的构造函数定义了一个从形参类型到该类类型的隐式转换。编译器在试图编译某一条语句时,如果某一函数的参数类型不匹配,编译器就会尝试进行隐式转换,如果隐式转换后能正确编译,编译器就会继续执行编译过程,否则报错。 explicit关键字只能用于类内部的构造函数声明上,...

2021-11-11 08:44:46 384

原创 C++ 位域及其内存分布

本文中的代码,插图来自:https://docs.microsoft.com/en-us/cpp/cpp/cpp-bit-fields?redirectedfrom=MSDN&view=msvc-160在C++的结构体或者类中,我们可以通过位域运算符来进一步限定成员变量占几个bit,比如// bit_fields1.cpp// compile with: /LDstruct Date { unsigned short nWeekDay : 3; // 0..7 (

2021-09-02 14:23:15 839

原创 C++11新特性之std::mem_fn函数

函数模板std :: mem_fn生成指向成员的指针的包装对象,该对象可以存储,复制和调用指向成员的指针。 调用std :: mem_fn时,可以使用对象的引用和指针(包括智能指针)。例子:

2021-06-11 15:16:56 1116

原创 git clone :unable to access github: OpenSSL SSL_read: Connection was reset, errno 10054

原因:由于Http协议错误,当 pull 或者 clone 的时候,github被墙屏蔽。首先尝试下面的方法:解决办法一:dce1e52f先修改设置解除ssl验证。918cfagit config --global http.sslVerify "false"918cfa然后重新clone即可如果不行,尝试下面的方法: 参考无法连接github,修改host映射 更新DNS缓存 Mac用户: sudo killall -HUP mDNSResponder

2021-04-11 14:20:42 2009 1

原创 C++中的字节对齐

一、字节对齐的定义计算机在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。二、对齐的作用和原因:1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这

2021-02-07 14:14:14 1329

原创 C++ 继承中的访问控制

继承类型 基类成员访问说明符 派生类成员访问说明符 public public public protected private private inaccessiable protected public protected protected protected private inaccessiable private public private protected private pr

2020-12-17 16:56:50 209

转载 树状数组介绍(简单易懂的原理讲解)

树状数组又称为Binary Indexed Tree(BIT)或者FenWick Tree树状数组可以解决什么样的问题:这里通过一个简单的题目展开介绍,先输入一个长度为n的数组,然后我们有如下两种操作:输入一个数m,输出数组中下标1~m的前缀和 对某个指定下标的数进行值的修改多次执行上述两种操作寻常方法对于一个的数组,如果需要求1~m的前缀和我们可以将其从下标1开始对m个数进行求和,对于n次操作,时间复杂度是O(n^2),对于值的修改,我们可以直接通过下标找到要修改的数,n次操作时间复

2020-08-25 10:27:11 1466 1

原创 C++ STL unordered_map中关于自定义key的一些约束

当我们在使用自定义类型作为unordered_map的key的时候,要求我们的自定义类型满足一下两点:1. 需要提供hash函数,这是由于unordered_map的底层数据结构是hash table,所以需要一个hash函数来key序列化然后返回哈希值class Dylan{public: Dylan() { name = ""; addr = ""; } Dylan(std::string na, std::string ad) : name(na), addr(ad) {

2020-08-13 15:36:11 1942 1

原创 C++ STL map 中关于自定义Key的约束

通常情况下,我们这样定义并且使用mapstd::map<int, int> map;map.insert({1,2});但当我们用自己定义的类类型作为key时,我们就会收到error的提醒#include <iostream>#include <map>class Dylan{public: Dylan() { name = ""; addr = ""; } Dylan(std::string na, std::string a

2020-08-13 15:12:01 1335 1

原创 c++中new的三种用法详解 清晰明了

一、概述new有三种使用方式:plain new,nothrow new和placement new。(1)plain new就是我们平常使用的普通的new运算符。void* operator new(std::size_t) throw(std::bad_alloc)void operator delete(void *) throw();提示:plain new在分配失败的情况下,抛出异常std::bad_alloc而不是返回NULL程序用例:#include "stda

2020-07-17 21:14:25 4070

原创 C++11中的std::bind 简单易懂

概述std::bind的头文件是 <functional>,它是一个函数适配器,接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。函数原型std::bind函数有两种函数原型,定义如下:template< class F, class... Args >/*unspecified*/ bind( F&& f, Args&&... args );template< clas.

2020-07-16 14:34:49 54392 2

原创 C++11中的std::function 简单易懂

在C++11中引入了std::function, 那么function有什么好处呢。简而言之, std::function是对C++中各种可调用实体的封装,形成一个新的可调用的std::function对象。可调用实体是什么呢?C++中都有哪些可调用实体呢?在C++中,可调用实体包括如下四类:  1、是一个函数指针。(函数必须和C函数一样可在编译期之内唯一确定的函数指针)  2、函数对象(也叫仿函数),即具有一个重载operator()成员函数的类对象。  3、是一个可被转换为函数指针的

2020-07-16 14:02:36 2436

原创 C++中,using指示与using声明的区别 简单明了

1 using 声明using 声明的作用域等同于本条using声明语句所在的作用域从效果上看就好像using声明语句为命名空间的成员在当前作用域中创建了一个别名一样” ——《C++ primer》5thint i = 1; namespace NS{ int i = 2;} void f(){ cout << i << endl; //输出1,指的是全局作用域中定义的i using N::i; //

2020-07-02 14:37:56 1475 1

原创 C++11 自定义Move构造函数(Move Constructor)和Move赋值运算符(Move Assignment Operators)

在C++11的标准当中,引入了右值的概念以及跟右值密切相关的Move语义,由此C++的类定义中也多了2个成员函数:Move构造函数和Move赋值运算符。这篇文章将讨论如何为我们自己的类编写Move 构造函数和Move赋值运算符。class IntArray 是一个Int 类型的数组,它的类定义如下:#pragma once#include <iostream>#inclu...

2020-03-07 16:27:16 5969

转载 C++ reinterpret_cast

reinterpret_cast <new_type> (expression)reinterpret_cast运算符是用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。什么是无关类型?我没有弄清楚,没有找到好的文档来说明类型之间到底都有些什么关系(除了类的继承以外)。后半句倒是看出了reinterpret_cast...

2020-03-06 20:16:46 1671

转载 const_cast and reinterpret_cast

const_cast函数原型:const_cast < type-id > ( expression )  去掉const属性:const_cast<int*> (&num),常用,因为不能把一个const变量直接赋给一个非const变量,必须要转换。  加上const属性:const int* k = const_cast<const in...

2019-09-18 16:34:54 340

转载 C++中static_cast和dynamic_cast强制类型转换

本文转自:https://www.cnblogs.com/wft1990/p/7126812.html在C++标准中,提供了关于类型层次转换中的两个关键字static_cast和dynamic_cast。一、static_cast关键字(编译时类型检查)用法:static_cast < type-id > ( expression ),该运算符把expression转换为t...

2019-09-18 16:07:27 582

转载 Perf -- Linux下的系统性能调优工具,第 2 部分

Perf -- Linux下的系统性能调优工具,第 2 部分特殊用法以及内核调优示例本文转自:https://www.ibm.com/developerworks/cn/linux/l-cn-perf2/本文内容简介之前介绍了 perf 最常见的一些用法,关注于 Linux 系统上应用程序的调优。现在让我们把目光转移到内核以及其他 perf 命令上面来。在内核方面,人们的兴趣五...

2019-03-19 13:09:58 863

转载 Perf -- Linux下的系统性能调优工具,第 1 部分

Perf -- Linux下的系统性能调优工具,第 1 部分应用程序调优的使用和示例本文转自:https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/index.htmlPerf 简介Perf 是用来进行软件性能分析的工具。通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可...

2019-03-19 10:49:34 734 1

转载 怎样使用C++类的前置声明代替包括头文件

这篇文章很大程度是受到Exceptional C++ (Hurb99)书中第四章 Compiler  Firewalls and the Pimpl Idiom  (编译器防火墙和Pimpl惯用法) 的启发,这一章讲述了减少编译时依赖的意义和一些惯用法,其实最为常用又无任何副作用的是使用前置声明来取代包括头文件。Item 26 的Guideline - "Never #include a he...

2018-11-03 16:55:55 927

转载 C++类的前置声明(二)

看完《Effective C++》条款31有感。。假设有一个Date类//Date.hclass Date {  private:      int year, month, day;  };  如果有个Task类的定义要用到Date类,有两种写法其一//Task1.hclass Date;  class Task1 {  public:      Da...

2018-11-03 16:42:27 208

转载 C++类的前置声明

前置声明的使用      有一定C++开发经验的朋友可能会遇到这样的场景:两个类A与B是强耦合关系,类A要引用B的对象,类B也要引用类A的对象。好的,不难,我的第一直觉让我写出这样的代码:// A.h  #include "B.h"  class A  {      B b;  public:      A(void);      virtual ~A(void);  }...

2018-11-03 16:38:12 1528

转载 UML中的关系介绍(依赖,关联,聚合,组合,泛化,实现)

本文转自:https://blog.csdn.net/backzero/article/details/7488535关于设计模式的总结没有落实到代码上,而且设计模式自己确实动手实现的非常少。所以在这一周里,除了看网站开发的视频,着手开始对设计模式进行实现以下。设计模式非常经典,每次看都有不同的收获,写一下自己的收获吧,请大家指正。 在实现设计模式之前,首先来复习以下UML中的五种关系图...

2018-10-29 15:02:49 1362

原创 C++新特性之lambda

lambda函数的语法定义如下:[capture](parameters) mutable -&gt;return-type{statement}解释:[capture]: 捕捉列表,总是出现在lambda函数的开始处。作为判断代码是否是lambda函数的标志。(parameters): 参数列表,如无参数,可省略mutable: mutable 修饰符,lambda默认情况下总是一个const...

2018-06-24 15:17:52 626 2

原创 C++11新特性之常量表达式 constexpr

1 常量表达式在C++11中引入了一个新的关键字“constexpr”,用来修饰一个函数或者变量使其变成一个常量表达式或值。比如下面的代码将函数GetConstValue变成一个常量表达式,并用这个常量表达式声明一个数组:constexpr int GetConstValue() {return 10;};int a[GetConstValue()];有了constexpr关键字,编译器就可以在...

2018-06-24 12:19:19 2600

原创 C++11新特性之强类型枚举及对原有类型的扩展

C++11标准以前的枚举类型有如下缺点:1. 非强类型,即在枚举中定义的成员会自动输出到父作用域,在枚举的父空间作用域中我们可以直接访问枚举中的某个成员而不需使用域限制符。2.可隐式转换为int类型。3. 占用存储空间,编译器会根据数据类型的不同对枚举类型分配不同的长度,例如在g++中,普通的枚举占用了4个字节,但如果数据长度大于四个字节,g++会将枚举类型扩展为8字节。例如下面的代码,Dbig的...

2018-06-23 15:06:26 1074

原创 C++11新特性之基于范围的for循环

C++11中引入了基于范围的for循环,当我们需要遍历一个范围可定的数组时,就可以使用这种方式:int a[5] = {1,2,3,4,5};for(int i: a){ cout&lt;&lt;e&lt;&lt;endl ;}注意:使用这种方式数组必须时范围可定的,对于一个类来说,此类必须定义了begin()和end()函数,且必须定义++ 和==等操作符。下面的例子中,数组的范围...

2018-06-23 13:47:55 388

原创 C++11新特性之追踪返回类型函数

追踪返回类型函数是指把函数的返回类型后置,这在模板类型推导过程中非常有用处,比如下面的代码:template&lt;typename T1, typename T2&gt;decltype(t1+t2) Sum(T1&amp;t1, T2&amp; t2){ return t1+t2;}在上面这个函数定义中,decltype无法推导出t1+t2的类型,因为编译器是从左向右处理的,当处...

2018-06-23 13:33:42 988 2

原创 C++11新特性之定义类型别名

在C++98中,我们通常用typedef关键字为类型第一别名:typedef unsigend char u_int8;在C++11中,为类型定义别名已不再时typedef的专属任务,using关键字也具有这一功能:using u_int8 = unsigned char;...

2018-06-10 16:31:28 611

原创 C++11新特性之用户字面量操作符

如下代码定义了一个RGB三元组以及一个以RGB为参数的blend函数:class RGB{public: RGB(uint8 R, uint8 G, uint8 B):m_r(R),m_g(G),m_b(B){}private: uint8 m_r ; uint8 m_g ; uint8 m_b ;};void blend(RGB &amp;&amp; ...

2018-06-10 16:18:35 2146 1

原创 C++11新特性之内联的命名空间(inline namespace)

C++11标准中,可以在父命名空间中定义内联的子命名空间,内联的子命名空间可以把其包含的名字导入到父命名空间中,从而在父命名空间中可以直接访问子命名空间中定义的名字,而不用通过域限定符Child::name的形式来访问。例如下面的代码:namespace Parent{ namespace Child1 { struct child1_data{int a;} ...

2018-06-10 15:44:41 5934 2

原创 C++11新特性之非受限联合体

1. 取消枚举对数据成员类型的限制联合体是C/C++语言中的一种数据结构。在这种数据结构中我们可以定义多种不同类型的数据,但这些数据却共享相同的一段内存空间。在C++98中,针对联合体中的数据类型有一些限制,即联合体中不能有非POD类型,静态类型以及引用类型。比如在C++98标准下,下面的代码将不会通过编译:class Person{public: Person(bool gender...

2018-06-10 13:48:44 1226

空空如也

空空如也

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

TA关注的人

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