自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一面之媛

自命清高的女程序媛

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

转载 RVO 和std::move

C++ 函数返回局部变量的std::move()问题? - 知乎

2023-04-12 18:44:42 127

转载 纯虚析构函数必须给出定义

Effective C++ 条歀07:为多态基类声明virtual析构函数(Declare destructors virtual in polymorphic base classes)纯虚函数纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。虚函数是C++语言的精髓。含有纯虚函数的类被称为抽象类,不能被实例化生成对象,只能派生。由它派生的类的纯虚函数如果没有被实现,那么,该派生类还是个抽象

2022-01-07 10:01:23 569

转载 The rule of three/five/zero

https://en.cppreference.com/w/cpp/language/rule_of_threeRule of threeIf a class requires a user-defined destructor, a user-defined copy constructor, or a user-defined copy assignment operator, it almost certainly requires all three.Because C++ copies

2020-12-05 21:25:57 596

转载 图说设计模式

https://design-patterns.readthedocs.io/zh_CN/latest/

2020-10-03 16:14:43 269

转载 Mac 电脑安装homebrew出现错误curl: (7) Failed to connect to raw.githubusercontent.com port 443几种解决方案

1. 解决方式一1.查看网址打开网站https://www.ipaddress.com/查询一下 raw.githubusercontent.com对应的IP 地址image.png2.替换系统的host文件注意:最好复制一份出来在更改image.pngimage.pngimage.png3.然后执行安装/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/in

2020-10-03 11:36:11 1894 1

原创 常见位操作算法

获取第i位先将1左移i位,然后跟原来的求与运算,出去第i位,其余位都清0,最后如果原来第i位为1,则返回true,否则返回false.bool getBit(int num, int i){ return ((num & (1 << i)) != 0);}置位先将1左移i位,然后再与原来的数做或运算,那么就能确保第i位被设置为1,其余位的数值保持不变。int setBit(int num, int i){ return num | (1 &.

2020-09-23 15:07:59 249

原创 位操作原理

X^0 = X X&0 = 0 X|0 = X X^1 = ~X X&1 = X X|1 = 1 X^X = 0 X&X = X X|X = X

2020-09-23 14:56:32 198

原创 二分查找非递归

public static int binary(int[] arr, int data) { int min = 0; int max = arr.length - 1; int mid; while (min <= max) { // 防止溢出 mid = min + (max - min) / 2; if (arr[mid] > data.

2020-09-23 14:27:58 81

转载 二进制乘法运算

在回答本问题之前,先学习一些有关位运算的知识。(1) 常用的等式: -n=~(n-1)=~n+1(2) 获取整数n的二进制中最后一个1: n&~(n-1)或者n&(-n)。例如n=010100,则-n=101100,n&(-n)=000100。(3) 去掉整数n的二进制中最后一个1: n&(n-1)。例如n=010100,n-1=010011,则n&(n-1)=010000。注:对n为正数或者负数都适用。先看一个实例:1011*1010,因为二进制

2020-09-23 14:01:35 8503

转载 数组指针和指针数组的区别

数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]p++; //该语句执行过后,也就...

2020-09-22 15:53:56 341

原创 革命尚未成功,同志仍需努力

再坚持一下下

2020-09-18 16:24:39 264

转载 智能指针源码解析

从源码理解智能指针(一)——auto_ptr、unique_ptr从源码理解智能指针(二)—— shared_ptr、weak_ptr

2020-09-17 09:43:31 1063

转载 侵入式容器 Boost.Intrusive

Boost.Intrusive 是一个很有意思的实现,里面实现了很多侵入式容器,在特定环境下,可以大大提升性能。首先我们得理解什么是侵入式,什么是非侵入式。普遍,我们认为std的容器,比如std::list都是非侵入式的。这是因为对于任何一个(支持复制或者移动的)类型T,我们都可以定义std::list<T>。当往std::list里插入一个元素时,它会分配一个节点,这个节点的结构类似于下面这个:struct Node { T data; Node* prev;

2020-09-13 20:29:54 2278

转载 C++ Performance Tips

C++ Performance TipsTable of ContentsIntroduction Constructors and Destructors Virtual Functions Return Value Temporaries InliningIntroductionThese tips are based mainly on ideas from the book Efficient C++ by Dov Bulka and David Mayhew. For a

2020-09-13 20:26:48 177

转载 C++的静态分发(CRTP)和动态分发(虚函数多态)的比较

虚函数是C++实现多态的工具,在运行时根据虚表决定调用合适的函数。这被称作动态分发。虚函数很好的实现了多态的要求,但是在运行时引入了一些开销,包括:对每一个虚函数的调用都需要额外的指针寻址 虚函数通常不能被inline,当虚函数都是小函数时会有比较大的性能损失 每个对象都需要有一个额外的指针指向虚表所以如果是一个对性能要求非常严格的场合,我们就需要用别的方式来实现分发,这就是今天这篇博客的主角CRTP。CRTP通过模板实现了静态分发,会带来很多性能的好处。可以参见The cost of dyn

2020-09-13 20:25:35 1093

转载 字符数组与字符指针的区别

1.字符指针可以指向一个字符串。 我们可以用字符串常量对字符指针进行初始化。例如,有说明语句:char *str = "This is a string.";是对字符指针进行初始化。此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。这里要注意字符指针与字符数组之间的区别。例如,有说明语句:char string[ ]="This is a string.";此时,string是字符数组,它存放了一个字符串。字符指针str与字符数组string的区别是:str是.

2020-09-09 11:39:33 6202 2

转载 几种方法判断平面点在三角形内

最近在做一个Unity实现的3D建模软件,其中需要在模型表面进行操作的时候,需要用到点和三角形位置关系的判定算法。由于一个模型往往是几千个三角片,所以这个判定算法必须高效,否则会影响最终程序的整体性能。这里记录一下一些算法,如有误请指出,谢谢!首先假设点和三角形在同一平面内,如果不在同一平面,需要用其它方法先筛选。常用的几种平面点-三角形位置关系判定方法有(以下算法执行必须先保证点和三角形位于同平面):1.顺时针/逆时针判定法该方法要求点的顺序是顺时针或逆时针的,如果是顺时针的点,沿着3条边

2020-09-09 09:01:08 10505

原创 计算机网络常见面试题

https://www.cnblogs.com/inception6-lxc/p/9152691.htmlhttps://zhuanlan.zhihu.com/p/60305452

2020-09-07 16:22:35 144

转载 Cmake和makefile

什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源

2020-09-02 14:16:29 502

原创 类成员变量可以是引用类型的么?

今天面试,面试官问我类的成员变量可以试引用类型的么?我回答yes。面试官:那怎么初始化呢?我:呃回来一试,确实可以,只不过不能用默认构造,必须带引用类型的构造函数完成初始化过程,而且一定要用初始化列表的形式完成初始化class Widget{public: // 构造函数形参为传值,不能保证正确性 //error: call to constructor of 'Ref' is ambiguous Widget (int target) :myref(tar

2020-09-01 19:29:43 2530 2

转载 What is Oracle Essbase?

OLAP概念联机分析处理OLAP通常是以多维的形式对数据进行钻取、汇总、切片、旋转等操作,以满足多层次、多角度数据分析的过程。OLAP包括两部分——提供用户多维操作的前端和支持多维分析的后端数据库。多维数据库,既可以是将数据以星形结构组织的RDBMS,也可以是Essbase这种专门的多维数据库。Essbase的维度是value-based dimension,即树型结构,维度中的成员按照层次组织,形成父子级关系,其中的每个成员可包含若干个子成员。最底层的成员没有子成员,称作叶成员(Leaf Memb

2020-08-31 19:56:12 246

转载 Linux 信号signal处理机制

最近写程序,各种bug各种错,有一回程序莫名退出,没报错,也没产生日志和core文件,貌似正常退出一样。但又不是在程序全部走完后退出,中途莫名退出,这就叫我想到了signal,应该是某些函数错误后发送kill信号给主进程,然后退出。现在总结下signal各种类型: Signal Description SIGABRT 由调用abort函数产生,进程非正常退出 SIGALRM 用a.

2020-08-30 21:25:10 362

转载 如何查看linux中文件打开情况?

前言我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof。linux下有哪些文件在介绍lsof命令之前,先简单说一下,linux主要有哪些文件:普通文件 目录 符号链接 面向块的设备文件 面向字符的设备文件 管道和命名管道 套接字以上各类文件类型不多做详细介绍。lsof命令实用用法介绍lsof,是list open files的简称。它的参数很多,但是我们这里只介绍一些实用

2020-08-29 10:22:56 1360

原创 C++异常机制

C++异常机制详解深入理解C++异常机制【C++】异常处理机制深度剖析

2020-08-28 20:56:34 110

转载 socket技术详解

socket编程是网络常用的编程,我们通过在网络中创建socket关键字来实现网络间的通信,通过收集大量的资料,通过这一章节,充分的了解socket编程,文章用引用了大量大神的分析,加上自己的理解,做个总结性的文章1:socket大致介绍 socket编程是一门技术,它主要是在网络通信中经常用到 既然是一门技术,由于现在是面向对象的编程,一些计算机行业的大神通过抽象的理念,在现实中通过反复的理论或者实际的推导,提出了抽象的一些通信协议,基于tcp/ip协议,提出大致的构想,一...

2020-08-28 16:20:57 535

转载 GDB常用命令总结

一、GDB概述Linux下的GDB调试器,是一款GNU组织开发的UNIX/Linux下的程序调试工具,它没有图形化的友好界面,但功能强大。二、准备工作(a) 安装GDB: apt install gdb(b) 创建main.cpp文件vim使用技巧:在按esc进入命令模式下,在!后可直接输入命令行进行执行,还可以进行上下键查看历史命令。这样可以在不退出vim的情况下进行编译,从而及早发现问题。三、GDB常用命令及调试实例由于调试程序是个极为频繁的操作,所...

2020-08-28 15:25:01 6001

转载 C++构造函数、析构函数与抛出异常么?

从语法上来说,构造函数和析构函数都可以抛出异常。但从逻辑上和风险控制上,构造函数可以,析构函数不推荐抛出异常。(1)构造函数可以抛出异常无论何时,从构造函数中抛出异常都是可以的。动态创建对象要进行两个操作:分配内存和调用构造函数。若在分配内存时出错,会抛出bad_alloc异常;若在调用构造函数初始化时出错,会不会存在内存泄漏呢?答案是不会。new运算符保证不会出现内存泄漏:T *p = new T;将被编译器转换给类似下面的样子: void allocate_and_cons.

2020-08-28 13:35:00 142

转载 STL vector,list,deque区别

在写C++程序的时候会发现STL是一个不错的东西,减少了代码量,使代码的复用率大大提高,减轻了程序猿的负担。还有一个就是容器,你会发现要是自己写一个链表、队列,或者是数组的时候,既要花时间还要操心怎么去维护,里面的指针啊,内存够不够用啊,长度问题,有没有可能溢出啊等等一系列的问题等着我们去解决,还是比较头疼的。所以容器的出现解决了这一个问题,它将这些数据结构都封装成了一个类,只需要加上头文件,我们就可以轻松的应用,不用那么复杂,就连指针也被封装成了迭代器,用起来更方便,更人性化,方便了我们的编程,对于程序员

2020-08-28 12:37:47 194

原创 C++常见面试题(转)

https://www.cnblogs.com/inception6-lxc/p/9244194.html

2020-08-28 12:35:07 81

原创 STL常用容器插入/删除/查找性能总结

容器名称 容器类型 插入性能 删除性能 查找性能 使用场景 vector 顺序 尾端:O(1) 非尾端P:O(N-P) 尾端:O(1) 非尾端P:O(N-P) O(1) 需要快速查找,不需要频繁插入/删除 list 顺序 O(1) O(1) O(N) 需要频繁插入/删除,不需要快速查找 forward_list 顺序 O(1) O(1)

2020-08-28 11:42:50 1726

转载 unorder_map的底层实现方法

哈希表哈希表是一个K_V的结构,,,,又被称为是散列表!!!!!它是根据关键字(key)来直接访问这个内存存储数据位置的数据结构;在构建哈希表的方法,我们这里主要介绍两种方法:1、直接地址法;什么意思呢?????就是直接取key(或者是某种线性函数)作为这个下表来存储数据 ,,,key在这里称作是 散列地址。。。可以理解成这个样子 Hash(Key)= Key 或Hash(Key)= A*Key + B,A、B为常数。。。。2、除留余数法;这里方法的说法是:就是..

2020-08-28 10:40:34 1536

转载 STL中map和set底层的红黑树实现

我们都知道map和set的实现是依赖红黑树的怎样写红黑树可以让map和set都可以使用呢?在这里我们定义了一个模版参数,如果它是key那么它就是set,如果它是map,那么它就是map;我们分析一下,红黑树迭代器的前置++到当前结点,就说明了它的左子树和自己都已经访问过了1,当前位置,若右树不为空,则访问右树的最左结点2,当前位置,若右树为空,则找祖先中孩子不是他的右若右访问完,那么父亲这棵树也就访问完了前置–的算法思想和++是近似的。比较大小时,set直接比较它的key,而map是比

2020-08-28 09:49:30 447

转载 C++11智能指针(unique_ptr、shared_ptr、weak_ptr)

很多人怕写C/C++ 程序就是因为指针,因为指针给了程序员高度的自由,同样也赋予了高度的责任,稍有不慎就导致内存泄漏。其实写C++ 可以完全不用指针,尤其C++ 11对智能指针作了进一步的升级,在不需要使用任何裸指针的前提下也可以写出高效的C++ 程序。C++ 11中定义了unique_ptr、shared_ptr与weak_ptr三种智能指针(smart pointer),都包含在<memory>头文件中。智能指针可以对动态分配的资源进行管理,保证任何情况下,已构造的对象最终会销毁,即它的析构

2020-08-27 16:21:38 350

转载 c++11 push_back与emplace_back之间的区别

使用empalce操作新标准中加入了三个新成员——emplace、emplace_front、emplace_back。这些是操作构造,而不是拷贝构造。这些操作分别对应以前的insert、push_front、push_back。允许我们将元素放置在一个指定位置之前或容器头部或容器尾部。当调用push或insert成员函数时,我们将元素类型的对象传递给它们,这些对象被拷贝到容器中。而当我们调用一个emplace成员函数时,则是将参数传递给元素类型的构造函数。emplace成员使用这些参数在容器管理

2020-08-27 13:56:54 700

转载 auto_ptr Vs. unique_ptr

auto_ptr是用于C++11之前的智能指针。由于 auto_ptr 基于排他所有权模式:两个指针不能指向同一个资源,复制或赋值都会改变资源的所有权。auto_ptr 主要有两大问题:o复制和赋值会改变资源的所有权,不符合人的直觉。o在 STL 容器中无法使用auto_ptr ,因为容器内的元素必需支持可复制(copy constructable)和可赋值(assignable)。unique_ptr特性o 拥有它所指向的对象o 无法进行复制构造,也无法进行复制赋值操作o 保存指向某个..

2020-08-27 12:40:32 323

转载 为什么不要在STL容器中存储 auto_ptr 对象?

大多数C++ 程序员都知道不要把auto_ptr 对象作为STL容器元素来使用。但是很少有人知道到底是为什么。C++标准如是说:“STL元素必须具备拷贝构造和可赋值……”,其意思是说对象可以进行安全的赋值操作,可以将一个对象拷贝到另一个对象,从而获得两个独立的,逻辑上相同的拷贝。尤其是当一个对象被拷贝到目标对象后,原来的对象不会改变。但 auto_ptr 却不然,用 auto_ptr 进行赋值和拷贝操作不仅会改变目标拷贝,而且还明显地改变原来的对象。明确地说,就是原来对象将指针的物主身份转换成目标对象,与此

2020-08-27 11:24:32 343

转载 超赞常见排序算法图解

常见排序算法及其时间复杂度一、内部排序:  在一个排序工作的执行过程中,如果待排序的记录全部保存在内存,这种工作就称为内排序;针对外存(磁盘、磁带等)数据的排序工作称为外排序。内排序中的归并排序算法是大多数外排序算法的基础。  在考虑算法时,最基本的问题是其时间和空间复杂度。为了在某种合理的抽象层次上考虑它们的时间复杂度和空间复杂度,需要确定关注的基本操作,以其作为时间单位,时间复杂性反映排序过程中这个(或这些)操作的执行次数。还需确定某种抽象的空间单位。  现在要做的是数据记录排序,而且基于关

2020-08-26 17:03:21 704

原创 STL map和unordered_map区别

map在底层使用了红黑树来实现,unordered_map是C++11标准中新加入的容器,它的底层是使用hash表的形式来完成映射的功能,map是按照operator<比较判断元素是否相同,以及比较元素的大小,然后选择合适的位置插入到树中。所以,如果对map进行遍历(中序遍历)的话,输出的结果是有序的。顺序就是按照operator< 定义的大小排序。而unordered_map是计算元素的Hash值,根据Hash值判断元素是否相同。所以,对unordered_map进行遍历,结果是无序的。使

2020-08-26 15:50:55 415

转载 死锁原因及解决方法

一、死锁的定义 多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。二、死锁产生的原因1)竞争不可抢占性资源 p1已经打开F1,想去打开F2,p2已经打开F2,想去打开F1,但是F1和F2都是不可抢占的,这是发生死锁。2)竞争可消耗资源引起死锁  进程间通信,如果顺序不当,会产生死锁,比如p1发消息m1给p2,p1...

2020-08-26 14:54:49 2578 1

转载 Linux上如何查看某个进程的线程

查看进程1. top 命令top命令查看系统的资源状况  load average表示在过去的一段时间内有多少个进程企图独占CPU  zombie 进程 :不是异常情况。一个进程从创建到结束在最后那一段时间遍是僵尸。留在内存中等待父进程取的东西便是僵尸。任何程序都有僵尸状态,它占用一点内存资源,仅仅是表象而已不必害怕。如果程序有问题有机会遇见,解决大批量僵尸简单有效的办法是重起。kill是无任何效果的stop模式:与sleep进程应区别,sleep会主动放弃cpu,而stop是被动放弃cpu ,

2020-08-26 14:38:21 2462

空空如也

空空如也

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

TA关注的人

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