- 博客(51)
- 收藏
- 关注
转载 C++11 标准新特性:Defaulted 和 Deleted 函数
https://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/index.html
2020-08-03 10:28:01 198
原创 关于单例模式下 类的静态成员函数能调用类的构造函数的问题
问题起源我觉得很困惑,于是一顿操作,证明了确实类的静态成员函数不能调用类的非静态成员函数即如果_data是非静态成员变量的话,编译不通过。请教了下组内大神 疑问点:类的成员函数不也是类的非静态成员函数嘛?怎么getInstance能访问呢?大神说:如果类内还有一个bar的非静态成员函数,那么getInstance去访问bar的话,会出错,原因是编译器在访问bar时,会需要提供一个this指针(相当于编译器认为this->bar),因此,此时调用会出错。然而调用类的构造函数时,..
2020-07-29 15:32:33 1335 2
原创 windows安装boost库
boost官网下载boost库编译参考https://gist.github.com/sim642/29caef3cc8afaa273ce6?tdsourcetag=s_pctim_aiomsg
2020-04-11 22:35:39 339
转载 在普通的函数当中调用虚函数和在构造函数当中调用虚函数有什么区别?
面试常见题。事实上在语法上是没有问题的,编译可以通过。问题在于构造函数中调用虚函数无法实现多态。看下面的代码:class A{public: A() { show(); }//行4 virtual void show() { cout << "A"; } void anotherShow(){show();}//行6}; class B:public A{pu...
2020-04-07 23:22:51 666 2
原创 实现简单shuffle 洗牌算法
比如说给一个函数,参数是k,要求生成1-k的随机序列。那么我的做法是先将nums置为1-k,再使用洗牌算法,将序列打乱。vector<int> shuffle(int k){ vector<int> nums; for(int i = 0;i<k;++i) nums.push_back(i+1); //洗牌 for(int i=nums.siz...
2020-03-27 22:40:27 309
原创 c++ overload(重载)、override(覆盖)、overwrite(重写)的区别
overload和override是用来实现C++多态的,C++多态主要是通过静态多态(overload、编译时确定)和动态多态(override、运行时确定,动态绑定)来实现的。overload 重载,即函数重载1、在同一个类中;2、函数名字相同;3、函数参数不同(类型不同、数量不同,两者满足其一即可,还有的说参数顺序不同,也是其一);4、不以返回值类型不同作为函数重载的条件over...
2020-03-27 20:33:39 503
转载 vector中push_back的复杂度
问题: 将N个元素使用push_back插入到vector中, 求push_back操作的复杂度。简单分析如下:考虑vector每次内存扩充两倍的情况。如果我们插入N个元素, 则会引发lgN次的内存扩充,而每次扩充引起的元素拷贝次数为 2^0, 2^1, 2^2, ..., 2^lgN.把所有的拷贝次数相加得到...
2020-03-27 18:40:49 992
原创 selcet、epoll的实现机制以及epoll为什么高效?
IO多路复用模型通常有三种:poll、select、epollselect一次事件处理的过程 : 需要两次拷贝和两次轮询(1次内核轮询、一次用户轮询)从用户态拷贝 文件描述符数组 到内核态。(用户态->内核态的拷贝)内核态需要遍历这个数组(轮询查看是否有事件准备就绪),如果有的话,会修改 拷贝到内核态的这个数组。(内核轮询)。内核将就绪好的数组拷贝给用户。(内核态->用户态的...
2020-03-23 23:55:07 265
原创 static关键字在c和c++中的作用
1、c语言中static的作用1.1、先来介绍它的第一条也是最重要的一条:隐藏当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容char a = 'A'; // global variablevoid msg() { printf("He...
2020-03-22 11:33:02 457
原创 字符串string和整数int的互相转化方式 (c++ 、c)
1、string转int的方法1.1 c的函数 char * 转 int int a = atoi(s.c_str());//c的函数 char * 转 int1.2 c++的函数string 转 intint b = stoi("12w");//c++的函数string 转 int 如果参数不正确,会抛出一个invalid_argument的异常,比如"w12w"1.3 采用sst...
2020-03-22 00:04:56 276
转载 论C++中复制(拷贝)构造函数与operator=(赋值运算符重载)
相信大家对复制构造函数与重载=运算符都不陌生,但是两者几乎是等效的,这会使很多萌新一脸懵逼,究竟这行代码是调用了复制构造函数还是调用了operator=函数呢?下面我们就通过实验来探究这个问题//拷贝构造函数(又名复制构造函数)与赋值运算符重载的区别class TestClass{ public: TestClass(); TestClass(const...
2020-03-19 23:09:25 2495 1
转载 String类的实现
详细的String类的实现#include<iostream>using namespace std;class String{ public: String(const char* str=NULL); //普通构造函数 Strng(const String &other); //拷贝构造函数 String...
2020-03-19 22:46:15 108
转载 c++野指针、内存泄漏、内存溢出?
野指针指针变量未被初始化。指针变量在创建的同时应当被初始化,要么将指针置为NULL,要么让它指向合法的内存*/int *m;//初始化指针变量,缺省值随机,乱指一气cout<<" m = "<<m<<endl;指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针有时指针在free或delete后未赋值 NULL,...
2020-03-19 22:14:54 292
转载 C++中为什么需要将基类的析构函数设置为虚函数?
大家知道,析构函数是为了在对象不被使用之后释放它的资源,虚函数是为了实现多态。那么把析构函数声明为vitual有什么作用呢?直接的讲,C++中基类采用virtual虚析构函数是为了防止内存泄漏。具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生...
2020-03-19 21:49:12 383
原创 剖析linux 管道、消息队列、共享内存,以及共享内存为什么最快?
前言1、缓冲区和缓存的区别CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,因为cpu的计算速度要比内存的读写速度快很多,而把这些可能会被重复访问到的数据存储于cpu缓存中,就会提高读取速度。可以说缓存是cpu和内存之间的临时存储器。也就是说,buffer是因为减少调用次数,集中调用,提高系统性能。而cache是将读取过的数据保存起来,重新读取时若命中(找到需要的数据...
2020-03-18 13:58:46 1317
转载 gcc编译程序四个阶段 预处理、编译、汇编、链接
我们在windows下的时候大部分通过vs等编译器来编写我们的代码,这种编译器有一个统称的名字叫做IDE(Integrated Development Environment)中文名字是集成开发环境,为什么叫它集成开发环境,是因为你只需要安装一个vs你就可以做到对代码的编辑、编译、调试等等,每次我们在vs环境下编写完代码之后拿一下f5程序自动开始执行,我们就能得到程序的执行结果,实际上在你编写完代...
2020-03-16 12:23:05 452
原创 网络-DNS协议及DNS域名解析过程
DNS协议作用:提供 主机名和IP地址间的映射关系名字到IP地址的解析是由若干个域名Server组成的, 域名Server程序在专设的结点上运行, 运行这些程序的机器成为域名服务器(Domain Server). 域名服务器的四种类型根域名服务器: 最高层次的域名服务器。记录着所有的顶级域名服务器的域名和IP地址。不管是哪一个本地域名服务器,若要对因特网上任何一个域名进行解析,只要自己无...
2020-03-12 20:15:34 792
原创 深入剖析os几种零拷贝机制的实现
1. 引言传统的LInux操作系统的标准I/O接口时基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。这样做最大的好处是可以减少磁盘 I/O 的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘 I/O 操作。但是数据传输过程中的数据拷贝操作却导致了极大的 CPU 开销,限制了操作...
2020-03-11 17:17:22 332
转载 网络传输-TCP协议如何保证传输可靠性
TCP协议传输的特点主要就是面向字节流、传输可靠、面向连接。这篇博客,我们就重点讨论一下TCP协议如何确保传输的可靠性的。确保传输可靠性的方式TCP协议保证数据传输可靠性的方式主要有:校验和序列号确认应答超时重传连接管理流量控制拥塞控制如果说要去掉一个确保传输可靠性的方式,那么拥塞控制是可以去掉的校验和计算方式:在数据传输的过程中,将发送的数据段都当做一个16位的整数。...
2020-03-08 22:55:27 408
转载 linux虚拟内存详解(MMU、页表结构)
Linux 的虚拟内存管理有几个关键概念:1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址;2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址;3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。...
2020-03-08 20:40:22 1105
原创 malloc和free底层实现原理
前言从操作系统角度来看,进程分配内存有2种方式,分别由2个系统调用完成:brk和mmap(不考虑共享内存)。brk是将数据段(.data)的最高地址指针_edata往高地址推mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内...
2020-03-08 18:00:06 2458
转载 TopK的优化之路
问题描述从arr[1, n]这n个数中,找出最大的k个数,这就是经典的TopK问题。栗子:从arr[1, 12]={5,3,7,1,8,2,9,4,7,2,6,6} 这n=12个数中,找出最大的k=5个。方法1:排序伪代码:sort(arr, 1, n);return arr[1, k];时间复杂度:O(n*lg(n))分析:明明只需要TopK,却将全局都排序了,这也是这个方...
2020-03-07 18:33:00 352
转载 c++之多线程创建的三种方式
c++11之后支持了多线程编程。在 C++11 中我们可以通过创建 std::thread 对象来创建新的线程。每个 std::thread 对象都可以与一个线程相关联。给 std::thread 对象添加函数,std::thread thObj();这个回调函数将在这个新线程启动时执行。这些回调可以是:函数指针函数对象Lambda函数使用函数指针创建线程#include <...
2020-03-04 20:51:15 3126
原创 操作系统os
虚拟内存这种机制使得期望运行的存储空间大于实际的物理存储空间。其方法是将程序放在磁盘上,而将主存作为一部分缓存,用来保存最频繁使用的部分程序,这种机制需要快速映像内存地址,用来把程序生成的地址转换为有关字节在 RAM 中的物理地址。这种映像由 CPU 中的一个称为 存储器管理单元(Memory Management Unit, MMU) 的部件来完成。上下文切换缓存和 MMU 的出现是对系统...
2020-03-01 00:57:46 112
转载 c++中指针和引用的区别
引用以下程序中,n 是m的一个引用(reference),m 是被引用物(referent)。int m; int &n = m; n 相当于 m 的别名(绰号),对 n 的任何操作就是对m的操作。所以 n 既不是m的拷贝,也不是指向 m 的指针,其实n就是 m 它自己。引用的规则引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。不能有 NULL 引用,引用...
2020-02-28 14:40:06 132
转载 c++的深拷贝和浅拷贝
1.在使用一个对象对另一个对象初始化或赋值时,若对象包含指针成员变量,则需要手动的编写拷贝构造函数实现深拷贝,调用编译器的内部默认的拷贝构造函数则只能实现浅拷贝操作。通过蓝色操作:在拷贝指针的同时为指针重新分配内存空间。2.通过深拷贝(显示重载=操作符,或显示定义拷贝构造函数)解决浅拷贝出现的问题使用默认的拷贝构造函数时:析构的时候,内部Name中有指针,那么obj1和obj2会指向同...
2020-02-27 18:56:22 145
转载 error:crosses initialization of ...的解决办法
switch(c){ case 0x01: int temp = a + b; .... break; case 0x02: break; default:break;}此时会报如题所示错误原因是因为C和C++中,一个变量的生命期(作用域)是这么规定的,中文还不好解释,英文原文是这样的:T...
2020-02-23 18:41:59 913
转载 C++字符串分割方法总结
在一些编程练习中,经常会对字符串进行处理,往往处理之前都会对字符串进行分割来提取各部分信息。在C++中虽然没有像python那样提供split这样直接的字符串分割函数,但也有一些其他的方法能够对其进行分割,下面介绍几种C++中常用的字符串分割方法。通过string成员函数实现在C++ string类中,提供了两个成员函数可以用来实现字符串分割,一个是find函数,另一个是substr函数,下面...
2020-02-15 20:21:01 895
转载 【C++----12】C++的sort函数的使用,基本语法和普通排序,数组使用和string排序使用;
sort使用:1.基本语法:1、需要使用头文件 #include和using namespace std;2、语法:sort(begin,end,cmp),cmp参数可以省略,默认按升序排序。3、begin表示要排序元素的首地址,end表示要排序元素的结束地址;2.默认从小到大排序:#include<iostream>#include<algorithm>...
2020-02-12 22:19:56 273
转载 Linux 批量杀死僵死进程
1 . top 命令 查看系统内有无僵死进程 zombie 代表僵死进程数2 . 使用命令ps -A -ostat,ppid,pid,cmd |grep -e ‘1’ 找出全部僵尸进程ps -A -ostat,ppid,pid,cmd |grep -e ‘2’-A 参数列出所有进程-o 自定义输出字段 stat(状态)、ppid(进程父id)、pid(进程id)、cmd(命令...
2019-09-20 17:06:44 1117
原创 redis集群部署的几种方法--参考官方文档
Redis部署集群的几种方法 参考官方文档https://redis.io/topics/cluster-tutorial一、 使用create-cluster 脚本 create-cluster脚本可以创建6个集群结点:由3个主节点master和3个副节点slaves构成1.1、下载编译1.1.1、 首先下载好redis-5.0.5.tar.gz压缩包<也可以使用command$...
2019-09-18 17:28:49 359
原创 c++标准程序库----第四章 通用工具
大部分通用工具在C++标准头文件内,也有某些通用辅助函数被定义于头文件中,但按照STL的定义,它们称不上是算法。型别pair,凡是需要将两个值视为一个单元的场合<例如必须”返回两个值“的某函数>,就必须用到它。4.1 pairs(对组)class pair可以将两个值视为一个单元,c++标准程序库内多处使用了这个class。尤其容器类别map和multimap就是使用pairs来...
2019-07-24 22:10:19 114
转载 LeetCode错误:control reaches end of non-void function[werror=return-type];
虽然有时我们在一块程序里已经有return,但不是在这块代码的结尾,leetCode也会编译不通过。所以我们也要在函数的代码块结尾也return一下。出现这种错误的时候,一般LeetCode还会在函数代码块的最后一行有红色的高亮提示。(虽然我想到了要加返回值,但是又默默地对自己说,明明是在中间写了的,在这里加又没有什么用…)见图:原文:https://blog.csdn.net/ide...
2019-07-23 17:02:50 14204 4
原创 c++标准程序库----第五章
随机存取迭代器(random access iterators)有vector、deques,可以使用算术运算即vector coll;for(int i=20;i<=40;++i)coll.push_back(i);vector::iterator pos25=find(coll.begin(),coll.end(),25);vector::iterator pos35=fin...
2019-07-16 22:26:01 152
转载 C++中的类拷贝构造函数和模板拷贝构造函数
类(包括模板类)构造函数是真实的构造函数;然而模板构造函数,其实质是模板函数。两者不能混为一谈。在一个模板类中,构造函数和模板构造函数同时存在时,优先调用构造函数。只有当确切符合模板构造函数的接口时,才调用模板构造函数。编译器永远不会把模板构造函数视为构造函数,即使客户没有自己定义拷贝构造函数,编译器也会生成一个默认的拷贝构造函数,这种情况同样存在于拷贝赋值函数和模板拷贝赋值函数。请看下面的例子:...
2019-07-08 17:34:57 1110
原创 c++标准程序库 第二章之型别转换、显式初始化
型别转换操作符(Type Conversion Operators)1、static_cast将一个值以符合逻辑的方式转型如:float x;cout<<static_cast<int>(x);//float转换为int2、dynamic_cast多态型别向下转型为实际静态型别。。。基类–>派生类。这是唯一在执行期进行校验的转型动作。如:class ...
2019-07-05 17:38:15 165
原创 c++标准程序库----第三章 一般概念
3.1 命名空间(namespace) std所谓namespace,是指标识符的某种可见范围。事实上,c++标准程序库中的所有标识符都被定义于一个名为std的namespace中。由于namespace的概念,使用c++标准程序库的任何标识符时,有三种选择:1、直接指定标识符,例如std::ostream而不是ostreamstd::cout<<std::hex<&l...
2019-07-05 11:51:59 527
原创 c++ 模板----成员函数模板
Member Template(成员模板)class member function可以是个template,但这样的member template既不能是virtual,也不能有缺省参数。例如:class MyClass{…template void f(T);}在这里,MyClass::f声明了一个成员函数集,适用于任何类型参数。参数类型为T类型。相同类型的类模板作为函数参数...
2019-07-04 17:47:29 4927
原创 论文笔记--Latency Reduction and Load Balancing in Coded Storage Systems (SoCC 17')
摘要纠删码以其低存储开销被用于存储系统中,以提高数据持久性。然而当请求数据的存储节点变为热点数据,由于缺乏灵活的负载均衡机制,被动地执行降级读,会遭受长的尾访问延迟。本文提出一种新视角来主动、智能地执行降级读并为每个请求或全部请求数据提出一些解决方案来达到负载均衡。实验分布在98台机器的集群上,播放来自Windows Azure Storage(WAS)1千2百万的trace请求。实验结果表...
2019-07-01 21:32:25 305
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人