自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Maven

MavenMaven使用流程:pom.xml其他标签:SNAPSHOT所有标签介绍maven项目目录层级的构成(不一定要全用)mvn操作maven配置插件resourceMaven使用流程:download在IDE中导入(一般自带的版本都较低)。pom.xml在project的root文件夹下有pom.xml文件(xml是一种可扩展标记语言。不像html是一种国际通用型,xml是...

2019-10-10 20:00:39 140

原创 NoSQL

NoSQLNoSQL关系型数据库主要优势缺点其他NoSQL主要目的优点数据结构的设计NoSQL关系型数据库主要优势SQL语言的支持有并发保护(通过事务控制):使得多个应用程序可以共同操作一份数据。缺点存储的关系结构和内存中的数据结构不符:以我们的程序为例就是经常要把类转化成JsonObject去存储。那已经是用到Nosql数据库了,如果用关系型还要更复杂的转化。关系型数据库不...

2019-10-10 19:33:40 146

转载 进程/线程上下文切换会用掉你多少CPU?

进程/线程上下文切换会用掉你多少CPU?进程上下文切换一个简单的进程上下文切换开销测试实验进程进程是操作系统的问题大发明之一,对应用程序屏蔽了CPU调度、内存管理等硬件细节,而抽象出一个进程的概念,让应用程序专心于实现自己的业务逻辑即可,而且在有限的CPU上可以并发执行许多个任务。但是它为用户带来方便的同事,也引入了一些额外的开销-进程上下文切换的开销。上下文切换在两个进程切换的过程中,先...

2019-09-28 16:44:51 193

转载 DynamoDB

DynamodbDynamodb简介基本组件主键二级索引Dynamodb简介dynamodb 是一种无架构的非关系型数据库,这表示属性及其数据类型都不需要预先定义。每个项目都能拥有其自己的独特属性。基本组件表 – 类似于其他数据库系统,DynamoDB 将数据存储在表中项目 – 每个表包含零个或更多个项目。项目 是一组属性,具有不同于所有其他项目的唯一标识(主键,DynamoDB的主...

2019-09-27 19:28:10 327

转载 线程安全的对象生命期管理(十)

心得与小结 优秀书籍:《Java Concurrency in Practice》 《操作系统设计与实现》、《现代操作系统》、《操作系统概念》选一,了解各种同步原语、临界区、竟态条件、死锁、典型的IPC问题等。 在多线程编程中要分析一切可能的竟态条件。 在单CPU时代的多线程编程和多CPU时代的...

2019-04-16 21:29:46 104

转载 线程安全的对象生命期管理(九)

弱回调 、把shared_ptr绑(boost::bind)到boost::function里,那么回调的时候StockFactory对象始终存在,是安全的。但延长了生命期。 像之前的析构函数问题,有时候我们需要知道对象是否或者,就像Observeable::notifyObservers()那样,称之为“弱回调”。这里再次用到weak_ptr,将shared_pt...

2019-04-16 19:03:19 99

转载 线程安全的对象生命期管理(八)

enable_shared_from_this 针对上次的问题,this指针的暴露依照前面的解法应该用shared_ptr来解决,但get()本身是个成员函数,如何获得一个指向当前对象的shared_ptr<StockFactory>对象呢? 可以使用enable_shared_from_this。这是一个以其派生类为模板类型实参的基类模板,继承它...

2019-04-16 17:10:48 91

转载 线程安全的对象生命期管理(七)

对象池 举例:class StockFactory : boost::noncopyable{public: shared_ptr<Stock> get(const string& key);private: mutable MutexLock mutex; std::map<string,shared_ptr<Stock>...

2019-04-16 11:49:03 113

转载 线程安全的对象生命期管理(六)

shared——ptr技术与陷阱 1、意外延长对象的生命期 shared_ptr是强引用,只要有一个指向x对象的shared_ptr存在,该对象就不会析构。而shared——ptr又是允许拷贝构造和赋值的(否则就不用引用计数了,scope_ptr..),但如果不小心遗留了一个拷贝没有释放,那么对象就会永久存在(内存泄漏)。这也是java内存...

2019-04-14 21:38:01 117

转载 线程安全的对象生命期管理(五)

再论shared_ptr的线程安全 前面已经提到,shared_ptr本身不是100%线程安全的。它的引用计数本身是安全且无锁,但对象的读写则不是,因为shared_ptr有两个数据成员,读写操作不能原子化。MutexLock mutex;//不需要加读写锁,只用互斥锁即可shared_ptr<Foo> globalPtr;//这个用例是把该指针安全地传给d...

2019-04-11 12:54:45 88

转载 线程安全的对象生命期管理(四)

将智能指针应用到Observer上: 因为weak_ptr拥有成员函数可以判断所指向的对象是否活着,那么观察者模式的竟态条件就可以通过这种判断来解决: class Observerable{public: void myregister(weak_ptr<Observer> x); //可用const weak_ptr<Observ...

2019-04-10 09:19:54 97

转载 线程安全的对象生命期管理(三)

C++里可能出现的内存问题大致有这么几个方面: 1、缓冲区溢出 2、空悬指针/野指针 3、重复释放 4、内存泄漏 5、不配对的new[]/delete 6、内存碎片 正确使用智能指针能很容易地解决前面5个问题。 1、缓冲区溢出:用vector<char&...

2019-04-09 21:25:37 99

转载 线程安全的对象生命期管理(二)

空悬指针: 当有两个指针同时指向一个对象时,如果只有一个指针对对象进行了销毁,哪怕后续做的再好,那另一个指针就是空悬指针了。一个“解决办法” 我的老师教过我,一旦有了困难,先想想能不能加入间接层,一旦问题复杂化,牵涉过多,就引入间接层,这是一种思想,就和不要使用一个变量表达多种含义一样,宁可多设置变量,毕竟变量的开销较小。 在这里,可...

2019-04-09 10:37:26 75

转载 线程安全的对象生命期管理(一)

线程安全的定义: 1、多个线程同时访问时,其表现出正确的行为 2、无论操作系统如何调度这些线程,无论这些线程的执行顺序如何交织 3、调用端代码无须额外的同步或其他协调动作。(如在调用函数前后加锁等)当析构函数遇到多线程: C++程序员需要自己管理对象的生命期,这在多线程下显得尤为困难。这里讨论当多个线程同时可以看到一个对象...

2019-04-08 21:17:44 165

原创 STL

STL1.容器 1.顺序容器 vector 矢量容器(向量容器):延一端增长 list 双向链表容器 deque 双端队列容器 2.关联容器 map 单映射...

2019-04-02 20:31:40 80

原创 Linux 文件管理命令

操作系统:管理软硬件资源,并为用户提供与计算机交互能力的一种软件。Linux:开源 多用户(允许多用户同时登陆系统工作) 内核小(安卓):运行速度快。 一切皆文件Linux 目录结构 /(根目录)/bi...

2019-04-02 19:09:35 72

原创 智能指针

强智能指针shared_ptr:        把管理的内存块的地址和有多少个指针指向封装成一个结构体(引用计数管理器(数组)),放在一个单独的类中。        接口:addRef()、delRef()、 getRef();        只需有一个管理器存在即可:适合使用单例模式:创建静态成员(为了线程安全应在类外先进行创建)        addRef():      ...

2019-01-24 21:31:42 184

原创 运算符重载、内存池、智能指针

内存池:为了解决频繁开辟内存、释放内存的效率问题和碎片问题。             效率问题:因为要每次开辟内存释放内存都要从用户态切换到内核态,状态的转换需要时间,                                                                         需要尽可能地避免。                              ...

2019-01-21 15:57:47 188

原创 类的生存周期和初始化列表

1、对象的生存周期:     如果形参是对象类型    建议使用引用,如果不用,多了对象的生成步骤,多了空间的开辟、构造函数、析构函数的调用,浪费资源。代码见下:第一次会显示3次函数调用,加引用后只有两次:#include&lt;iostream&gt;#include&lt;string.h&gt;using namespace std;class Object{publi...

2018-12-06 17:09:18 139

原创 const

const(c语言中):定义常变量          1、将变量变成只读(不可修改)(static:静态,外界不可见)          2、数据类型对于const而言时透明的          3、const修饰它的直接右边,不能做左值(做左值即可修改)          4、权限可以同等或者缩小传递,但不能放大传递const(c++中)         1、修饰变量:将...

2018-11-30 20:59:01 103

原创 C、C++语言编写的函数互相调用

1、C++调用C接口:          C++  extern “C”(调用的地点使用,相当于调用C函数)2、C调用C++接口          C++  extern “C”(把整个函数改为C,还是相当于调用C函数)          C++无法修改,即不能加extern?          在写文件时遇到无法修改的问题:另加中间层:再写一个C++文件,调用该函数,再在新C...

2018-11-30 20:48:24 603

原创 函数的默认值、函数重载、inline函数

1、函数的默认值:    1、函数的默认值一般写在函数的声明中(函数的定义也可以写,但一般可见的是函数的声明,所以给在声明中)    2、自右向左依次赋值    3、默认参数不可重定义(只能赋值一次),可以轮流定义(遵循2)    4、默认值的限制        1、不能使用局部变量        2、可以使用全局变量,函数返回值#include&lt;iostream...

2018-11-30 20:28:17 416

原创 函数调用过程、调用约定和返回值的返回方式

函数的调用过程:(带括号的是非主函数被调用时的调用过程)    (0.形参的初始化。)    (0.1压入下一行指令地址)    1.开辟主函数栈帧空间并初始化    2.压入调用方栈底指针寄存器的值    3.移动ebp到被调用方栈底    4.移动esp到栈顶    5.为了保留3个寄存器的值,把寄存器的值先压入(修改了也不怕了,反正可以找回)    6.开辟局...

2018-11-23 19:31:36 1663

原创 编译,链接(二)

.c文件                                                                                                =&gt;                                 进程           预编译成.i文件    =&gt; 编译处理成.s文件      汇编成.o文件     =&...

2018-11-15 18:21:17 86

原创 编译,链接(一)

.c/.cpp文件 -&gt;.exe文件需要经过   预编译         编译          汇编            链接虚拟内存空间:分为:约128M:0x08048000.text 段:存储代码(指令).data段: 数据段(存储所有的已初始化的全局变量和所有局部变量).bss段: 存储未初始化的全局变量(不占用空间,内容存储在.comment段)...

2018-11-10 23:51:07 67

原创 (C语言)如何判断所处环境使用的是大端还是小端

一、定义:参考百科定义https://baike.sogou.com/v53138664.htm?fromTitle=%E5%A4%A7%E5%B0%8F%E7%AB%AF%E6%A8%A1%E5%BC%8F。    大端模式,是指数据的高位,保存在内存的低地址中,数据的低位,保存在内存的高地址中(这样的存储模式类似于把数据当作字符串处理:从左往右存放,也是从大到小存放数据)。    ...

2018-09-18 17:35:38 1390 1

原创 内存对齐(结构体)

结构体的内存对齐总结:1、每一个成员所占字节数必须是前面所有成员所占内存数的公约数,如果不是,则要加上所缺的字节数。2、为了使结构体指针使用时可以达到和结构体一样的快速摘取成员的效果,要求:当最后一个成员已经满足1中的条件时,还要比较最后成员所占字节数是否是所有成员中最大的一个,如果不是,则最后成员所占字节数为最大成员所占字节数。3、总结:为了节约空间,在定义结构体成员时,最好将小字节数的成员定义...

2018-05-05 20:18:49 79

原创 进制

题目:假设在n进制下,下面的等式成立,567*456=150216n的值是:    A:9    B:10    C:12    D:18解:(1)使用进制的运算将左右都展开:(5n^2+6n+7)*(4n^2+5n+6) = n^5+5n^4+2n^2+n+620n^4+49n^3+88n^2+71n+42 = n^5+5n^4+2n^2+n+6(2)两边同时对n求余42%n=6%n通过进制的原...

2018-04-20 18:13:08 77

原创 二维数组(数组指针的存储形式)

首先,原理为一维数组的数组名表示数组首元素的地址看以下代码:#include&lt;stdio.h&gt;//void Show(int **brr)//error,如果传的是二维数组,则该方法是错误的,说明二维数组名并不是二级指针//void Show(int brr[3][4])//这样的话对二维数组过于限制,将行列都给出,不便于代码的重用,不好void Show(int (*brr)...

2018-04-17 16:44:31 1133

原创 指针运算与字符串复制

1、指针运算1、指针加法:指针名加数字    指针加法自动调整,调整的权重为指针类型所占字节数(sizeof(指针去掉一个*))2、指针减法:指针名-数字    指针减法自动调整,调整的权重为指针类型所占字节数(sizeof(指针去掉一个*))3、指针加指针:非法,无实际意义。4、指针-指针:合法,表示间隔的单元个数(自动调整,同指针的加减法)    (1)算出间隔字节数    (2)除以调整的权...

2018-04-10 16:30:46 352

原创 使用交换函数交换两个变量的值(以int类型为例)的错误用法以及正确用法

原理:在这里将调用函数换个名称:父函数,被调用函数称为:子函数,放便区别:    子函数的改变要想修改父函数的值,必须满足:    (1)传指针    (2)解引用(*)错误调用代码1:#include&lt;stdio.h&gt;void Swap(int a,int b){ int tmp; tmp = a; a = b; b = tmp; }int main(){ i...

2018-03-31 15:01:21 744

原创 指针与数组

1、指针1、指针==地址2、取任何变量的地址都用&amp;(取地址运算符(单目))变量名3、*指针变量名,间接访问(跳到、解引用)到指针指向的变量。代码说明:#include&lt;stdio.h&gt;int main(){ int a = 10; int b = 20; int *p = &amp;a; //定义时变量类型后加*说明p是个指针变量,指向的类型同*前的类型。 *p ...

2018-03-31 14:33:12 71

原创 统计十进制数n的位数、正序输出和逆序输出十进制数字n

1、求十进制整数n的位数:n/=10;每除一次10可以丢一位,如123/10=12;代码实现:int GetFigures(int n){ int count = 0; do { count++; n /= 10;//丢弃个位 123/10=12 }while(n != 0); return count;}2、逆序输出十进制整数n的各位数:    n%10即可得到最低...

2018-03-27 19:34:49 912

空空如也

空空如也

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

TA关注的人

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