自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 c++之编译过程

文章目录编译过程process目标文件存储格式目标文件格式拓展编译过程process预编译(预编译器处理如 #include、#define 等预编译指令,生成 .i 或 .ii 文件)编译(编译器进行词法分析、语法分析、语义分析、中间代码生成、目标代码生成、优化,生成 .s 文件)汇编(汇编器把汇编码翻译成机器码,生成 .o 文件)链接(连接器进行地址和空间分配、符号决议、重定位,生成 .out 文件)目标文件存储格式段功能File Header文件头,描述整个

2021-01-14 11:44:26 166

原创 c++代码中加载动态库

文章目录c++代码中加载动态库生成动态库代码中加载动态库,并调用warningc++代码中加载动态库生成动态库1.h#pragma once// extern "C" void print(); // 以c的方式编译void print(); // 以c++的方式编译extern void func();1.cpp#include <iostream>#include "1.h"using namespace std;void print(){ cou

2021-01-14 11:24:16 1689

原创 c++11之新特性

HOME文章目录HOME统一初始化缩窄std::initializer_listcode声明统一初始化c++扩大了用{}的使用范围,使其可用于内置类型和自定义类型缩窄初始化列表语法可防止缩窄,即禁止将数值赋给无法存储它的数值变量; 在编译器会报错std::initializer_listC++11提供了模板类initializer_list,可将其用作构造函数的参数code#include <iostream>#include <cstring>#i

2021-01-11 21:29:21 186

原创 c++之extern 变量

extern 变量如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量extern int i; //声明i而非定义iint j;// 声明并定义jtips:是引用其它源文件中的变量的时候用codemain.cpp#include <iostream>#include "1.h"using namespace std;extern int aa; // 引用其它源文件中的变量void modify(){ aa =

2021-01-04 16:31:09 372

原创 设计模式之Template Method

动机:对于某一项任务,常常有稳定的正常操作结构,但是各个子步骤却又很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。设计关键:任务要求有固定的操作框架优点:晚绑定,更加灵活缺点:代码如下:// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include...

2020-04-17 22:00:19 116

原创 设计模式之适配器模式

动机:现有的对象不支持新的应用环境设计关键:在原有的接口上进行适配(并非修改原有接口)优点:有效理由现有代码,节省开发工作效率缺点:无代码如下:// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include<iostream>using namespace std;cla...

2020-04-17 21:59:07 99

原创 设计模式之简单工厂

动机:通过“对象创建”来绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定设计关键:客户端完全不需要操作具体类,只需要提供要创建具体类的参数优点:实现了对象的创建和使用的分离 客户无需知道产品的类名,只需要传入响应的参数即可 客户端不改动的情况下,服务端新增或者更换具体的产品类功能显得更加灵活缺点:工厂类的职责过重,包含了加减乘除各...

2020-04-17 21:56:59 113

原创 linux程序运行步骤

操作系统创建进程,把控制权交给程序的入口(往往是运行库中的某个入口函数) 入口函数对运行库和程序运行环境进行初始化(包括堆、I/O、线程、全局变量构造等等)。 入口函数初始化后,调用 main 函数,正式开始执行程序主体部分。 main 函数执行完毕后,返回到入口函数进行清理工作(包括全局变量析构、堆销毁、关闭I/O等),然后进行系统调用结束进程。 一个程序的...

2020-04-17 21:55:42 842

原创 c++运行时类型识别:RTTI

1.通过RTTI,能够通过基类的指针或应用来检索其所指对象的实际类型。2.c++通过两个操作符提供RTTI:<1>typeid:返回指针或者应用所指对象的实际类型<2>dynamic_cast:将基类的指针或者引用安全的转换为派生类的指针或者引用。注意:基类至少有一个虚函数(虚析构也算);指针转换失败,返回0;引用转换失败,抛出bad_cast类型异常3.注意type...

2020-04-17 21:54:17 173

原创 std::bind

1.概念:通用的函数适配器,它接受一个可调用对象(普通函数,函数指针,函数对象,lambda表达式,bind创建的对象),生成一个新的可调用对象(函数对象/std::function)2.实现原理:它可以将函数(函数指针、functor、lambda)和函数所需的参数(任意个数参数)绑定为一个对象,我们在后续用到的时候可以直接调用这个对象的operator()函数即可实现对这个函数的调用。...

2020-04-17 21:53:52 168

原创 c++虚函数表

1.c++通过基类指针或者引用调用虚函数时,执行的代码是其真实类型中的函数,是通过虚函数表实现的,虚函数表存放的是指向虚函数地址的虚函数指针2.代码如下:#include<iostream>#include<functional>using namespace std;//注意此段代码兼容32位和64位系统,在X86和X64下运行正常class Base...

2020-04-17 21:53:37 188

原创 设计模式之面向对象八大原则

DIP(依赖倒置原则)--高层模块(稳定)和底层模块(变化)都应该依赖于抽象(稳定);实现细节(变化)依赖于抽象(稳定) OCP(开放封闭原则)--对扩展开放,对更改封闭;类模块应该是可扩展的,但是不可修改 SRP(单一职责原则)--一个类应该仅有一个引起它变化的原因;变化的方向隐含着类的责任 LSP(Liskov替换原则)--子类必须能够替换它们的基类(is-A);继承表达类型抽象 IS...

2020-04-17 21:52:52 124

原创 c++ RAII

概念:RALL(Resource Acquisition Is Initialization),也称为“资源获取就是初始化”,是c++语言的一种管理资源,避免泄漏的惯用法。 效果:c++标准保证任何情况下,已构造的对象(生命周期结束时)最终会销毁,即它的析构函数最终会被调用。 智能指针就是通过使用RAII技术,来保证资源正确的初始化和释放,实质上是一个对象,行为上表现得却像一个指针...

2020-04-17 21:51:29 496

原创 operator new/operator delete

1.重载operator new(),可以写出多个版本,前提是每一个版本的声明都必须有独特的参数列,其中第一个参数必须是size_t,其余参数以new所指定的placement arguments为初值。出现于new(...)小括号内的便是所谓的placement arguments.Foo *pf = new(300,'c') Foo;2.也可以重载class member oper...

2020-04-17 21:50:59 133

原创 c++ struct和class区别

class的默认访问权限是private,struct的默认访问权限是public class D:Base(),struct D:Base(); class默认是private,struct 默认是public

2020-04-17 21:50:35 120

原创 remove_refrance/std::move

它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。 代码如下: template <typename T>typename remove_reference<T>::type&& move(T&& t){ return static_cast<typename remove_refer...

2020-04-17 21:50:22 243

原创 coredump调试-gdb/addressSanitizer

1.通过强大的GDB调试2.通过在gcc/g++ 4.8版本以上使用AddressSanitizer,添加-fsanitize=address -fno-omit-frame-pointer选项,代码中重定位stderr到文件中,方便跟踪错误;代码如:freopen("stderr.log","a",stderr);可以参考:https://zhuanlan.zhihu.com/p/2...

2020-04-17 21:49:49 459

原创 c++模板

模板是c++泛型编程的基础,是实现代码重用机制的一种工具,他可以实现类型参数化,即把类型定义为参数,从而实现真正的代码可重用性。模板分为两类,一个是函数模板,另外一个是类模板。形式为template<typename T>/template<class T> 函数模板的实例化(利用给定的实参来推断模板参数或者是指定的模板参数)在编译期进行 编译器不能为类模板推断模板参数...

2020-04-17 21:49:24 256

原创 c++多继承

多继承派生类对象内存布局:先放有虚函数的基类,接着放没有虚函数的基类,然后是派生类自己的数据成员 在多继承下,有多少个虚函数的基类就有多少个虚函数表指针 派生类中新增的虚函数,添加在第一张虚函数表中 在派生类对象中,同名的虚基类只产生一个虚基类子对象,而同名的非虚基类则各产生一个非虚基类子对象 虚基类的子对象是由最后派生出来的类的构造函数通过调用虚基类的构造函数来初始化的 虚基类并不是在...

2020-04-17 21:49:08 137

原创 STL适配器

适配器(Adapters)--一种用来修饰容器/仿函数/迭代器接口的东西容器适配器:stacks(基于deque),queues(基于deque),priority queue(基于vector)仿函数适配器:bind,mem_fn,not1,not2迭代器适配器:reverse,insert,stream,move...

2020-04-17 21:48:29 126

原创 STL迭代器

头文件:<iterator>迭代器种类:output迭代器:Ostream,inserter input迭代器:istream forward迭代器:Forward list,unordered containers Bidirectional迭代器:List,set,multiset,map,multimap Random-access迭代器:Array,vector...

2020-04-17 21:48:16 113

原创 STL整体结构

STL整体结构包含六大组件容器(containers)--各种数据结构(vector,list,array,Deque,Set,Map),各容器为类模板 算法(Algorithms)--是用来操作容器中数据的函数模板,sort,search,copy,erase等, 迭代器(Iterators)--提供访问容器中对象的方法,扮演容器和算法的之间的胶合剂,为一种Class Template,...

2020-04-17 21:47:26 195

原创 cpu占用率高的简单定位分析

top--查看cpu占用率高的进程 top -H -p pid--查看进程内各线程cpu占用率高的线程 通过strace -T --r -c -p pid 来查看系统调用和花费的时间 pstack pid 查看线程的调用堆栈的,结合代码很容易看到在哪里导致了busy loop查看cpu占用的函数调用分布可以通过gperftools来查看...

2020-04-17 21:46:53 171

原创 c++ IO流

1.分为3类:标准io流,文件流,字符串流2.结构如图:3.缓冲区--输出设备或磁盘文件,系统开辟一块内存作为输出缓冲区(buffer),写操作只是写到缓冲区中,等多次或者需要时将缓冲区数据真正写入文件中。如此,来解决高速设备和低速设备的匹配。4.cout<<endl; 或者cout<<flush;或者cout<<ends;都会刷新缓冲区...

2020-04-17 21:46:29 129

原创 单链表反转-c++

思路:首先保留头结点 ,分为两段,一个已倒序的list,一个待处理的list. 代码如下: #include<iostream>#include<functional>using namespace std;struct Node{ int data = 0; Node* p_next = nullptr;};Node* reverse_lis...

2020-04-17 21:44:58 248

原创 线上内存泄漏的方法分析valgrind/jemalloc

方法1:通过valgrind -v --tool=memcheck --trace-children=yes --time-stamp=yes --track-fds=yes --log-file=./valgrind.log --demangle=yes --num-callers=24 --leak-check=full --show-reachable=yes --show-pos...

2020-04-17 21:44:09 877

原创 c++对象只能在堆上或者栈上创建

栈上创建对象:只有使用new运算符,对象才会建立在堆上,因此,只要禁用new运算符就可以实现类对象只能建立在栈上。将operator new()设为私有即可。代码如下: class B{private: void* operator new (size_t t) {} // 注意函数的第一个参数和返回值都是固定的 void operator delete (v...

2020-04-17 21:42:58 669

原创 c++匿名命名空间

匿名命名空间是c++的特性,相对于c的static声明来说,可以在匿名的空间里面声明很多变量和函数,这样可以省去对每个变量和函数添加static声明。实质上匿名空间的功能跟static声明是一样。 当定义一个匿名命名空间时,编译器在内部会为这个命名空间生成一个唯一的名字,而且还会为这个匿名的命名空间生成一条using指令. namespce { char c; ...

2020-04-17 21:42:39 356

原创 c++11语言新特性

模板的闭符之间不需要空格:vector<list<int> > 等同于vector<list<int>> nullptr取代0或者NULL 以auto完成类型自动推导 一致性初始化与初值列;使用大括号进行初始化动作,如: int values[]{1,2,3} vector<int> v{1,2,3};初值列如:int ...

2020-04-17 21:42:21 180

原创 可重入函数和线程安全

一个函数对于多个线程是可重入的,则这个函数是线程安全的 一个函数是线程安全的,但并不一定是可重入的,比如使用了互斥锁实现的线程安全 可重入性要强于线程安全性...

2020-04-17 21:41:51 111

原创 tcp有序/可靠/流量控制/拥塞控制

tcp包头格式: tcp的有序性是通过序号保证的 tcp的可靠性是通过确认序号保证的 顺序问题、丢包问题、流量控制都是通过滑动窗口来解决的 拥塞控制是通过拥塞窗口控制的...

2020-04-17 21:41:34 326

原创 页面置换算法

在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存中选择一个页面将其移出内存,以便为即将调入的页面让出空间。而来选择淘汰哪一页的规则叫做页面置换算法。 分类: <1> 全局置换:在整个内存空间置换 <2> 局部置换:在本进程中进行置换 全局置换算法: 工作集算法 缺页率...

2020-04-17 21:41:01 113

原创 LRU算法--作为缓存

LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰。 实现思想:用list保存数据,用unodered_map保存指向list的指针(方便定位查找),和一个数据量的最大值 代码如下: #include<iostream>#include<functiona...

2020-04-17 21:40:39 182

原创 STL之容器

unordered map == hash mapunordered set == hash setunordered 容器通过hash table实现set,map,multiset,multimap 存入元素必须有比较运算(如<,要保证序关系)unordered_set,unordered_map,unordered_multiset,unordered_mul...

2020-04-17 21:39:20 128

原创 主机字节序与网络字节序

主机字节序:又叫cpu字节序,其不是有操作系统决定的,而是由cpu指令集群架构决定的 主机字节序分为两种 <1>大端字节序(big endian)--高序字节存储在低位地址,低序字节存储在高位地址 <2>小端字节序(small endian)--高序字节存储在高位地址,低序字节存储在低位地址 如图: 内存地址 0x00 ...

2020-04-17 21:38:41 157

原创 signal处理中的函数可重入问题

概念:信号是软件层次上模拟的中断,它是一种异步通信的处理机制。信号的异步性意味着,应用程序不用等待事件的发生,当信号发生时应用程序自动陷入到对应的信号处理函数中。产生信号的时间对进程来说是随机出现的。 信号的响应方式有忽略,捕捉,执行默认动作三种 可重入函数可以由多于一个线程并发使用,而不必担心数据错误。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入性解决函数运行结果的确...

2020-04-17 21:37:42 343

原创 tcp连接3次握手

TCP 三次握手建立连接 【TCP 建立连接全过程解释】 <1>客户端发送 SYN 给服务器,说明客户端请求建立连接; <2>服务端收到客户端发的 SYN,并回复 SYN+ACK 给客户端(同意建立连接); <3>客户端收到服务端的 SYN+ACK 后,回复 ACK 给服务端(表示客户端收到了服务端发的同意报文); <4>服务端收到...

2020-04-17 21:32:03 139

原创 tcp timewait过多

查看tcp状态统计命令:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' what:主动closeTCP(server和client都可以) 连接的那一方出现的状态 why:主动close(server和client都可以)的一方需要等待2MSL时长,默认2min(可以配置) how: 设置socket...

2020-04-17 21:30:22 123

原创 阻塞/非阻塞 同步/异步

1.同步和异步 关注的是消息的通讯机制 关注对象是被调用者同步--发出调用时,在没有得到结果之前,该调用不返回。一旦返回就能得到返回值。 调用者主动等待被调用者返回结果异步--发出调用时,直接返回,没有返回结果。 当一个异步过程调用发出后,调用者不会立刻返回结果。 被调用者通过状态或者回调来通知调用者有结果需要处理2.阻塞与非阻塞 关注的是进程在等待调用结果(消息,返回值)时的...

2020-04-17 21:29:49 135

原创 四则运算-c++

思路: 中缀表达式转后缀表达式 思路:(一个操作符stack和一个后缀vec) 从左往右遍历 数字直接入后缀vec 操作符压入操作符stack 操作符stack为空,任何符号压入操作符stack 不为空 左括号直接压入操作符stack 遇到右括号,util 操作符stack中最近的左括号全部依次出操作符stack入后缀vec ...

2020-04-17 21:29:05 385

空空如也

空空如也

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

TA关注的人

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