自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

常敲代码手不抖

喜欢什么,就学什么呗...

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

原创 STL源码剖析——vector的实现原理总结

    vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对

2015-08-07 10:53:47 1688

原创 TCP/IP 三次握手与四次挥手详解

所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。    三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。    建立连接协议(三次握手)    (1)客户端发送一个带SYN标志的

2015-08-06 21:11:18 949

原创 Linux进程内存空间分段

Linux的内存空间简单可以分为5个部分:    Text(代码区):存放可执行的指令操作,其只读不能写    Bss(静态区or全局区):存放未初始化的全局变量和静态变量    Data(数据区):存放初始化的全局变量和静态变量    Stack:存放临时变量,函数参数等    Heap:存放new/malloc等动态申请的变量,用户必须手动进行delete/free操作。 其中Stac

2015-08-06 13:57:25 2711

原创 malloc实现原理

malloc是怎样实现的呢?答案就是:可以基于伙伴系统实现(关于伙伴系统在之前的文章里面已经讲过),也可以使用基于链表的实现 。    它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表   调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分

2015-08-06 13:40:39 1053

原创 C/C++ 中内存对齐问题

我们通过几个例子来全面搞懂c/c++中的内存对齐问题。来看看下面的结构体大小分别是多大?(假设均在32位机器上)    struct A {char a;char b;char c;};    这个相信大家都知道,由于变量都是char类型,对齐值为1,所以结构体大小为3。struct B {int a;char b;short c;};    对齐值

2015-08-06 12:05:35 765

原创 浅谈指针和引用

我们知道用指针和引用来定义函数形参的时候,都可以直接改变参的值。那么指针和引用有哪些区别呢?    我们先根据引用和指针的定义展开:引用是某个变量或者对象的别名,而指针则存储的是一个机器码地址,这个地址是某个具体变量或者对象的地址。因此区别有:    1)指针可以为空,但是引用不行    2)声明指针可以不指向任何对象,因此使用指针之前必须做判空操作,而引用则不必    3

2015-08-06 11:58:13 525

原创 define和inline关键字比较

这里我们学习一下define和inline关键字的用法,以及它们的区别。    define:定义预编译时处理的宏,只是简单的字符串替换,无类型检查。    inline:1、inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义,编译阶段完成。  2、内联函数要做类型安全检查,inline是指嵌入代码,在调用函数的地方不是跳转,而是把代码直接写到那里

2015-08-06 11:38:43 4666

原创 malloc和new有什么区别

大家都知道malloc和new都是我们程序员自己申请内存空间,那它们有什么区别呢?    1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。    2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于mall

2015-08-06 09:42:06 535

原创 C++ 强制类型转换

C++中主要包含了四种强制类型转换,让我们来看看它们的区别和联系。    static_cast:这是最常见的一种强制转换了,在功能上基本和C风格的类型转换一样,含义也一样。允许执行任意的隐式转换和相反转换动作(即使它是不允许隐式的)。例如:应用到类的指针上,意思是它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时也能够执行想敏感词作:转换父类为它的子类。   

2015-08-06 09:03:10 496

原创 C++ 虚函数实现原理

首先,我们要明白虚函数的作用:简单讲就是实现多态。    基类定义了虚函数,子类可以重写该函数,当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态地调用属于子类的该函数,且这样的函数调用是无法在编译期间确认的,而是在运行期确认,也叫做迟绑定。    底层实现原理:先来看看C++对象模型        在此模型中,non static 数据成员被放置到对象内部,

2015-08-05 20:24:39 1253

原创 C++ 中的虚继承

首先我们要明白虚继承的作用:为了解决从不同途径继承来的同名数据成员在内存中有不同的拷贝造成数据不一致的问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样就不仅解决了二义性的问题,也节省了内存,避免了数据不一致的问题。举例如下:    class CA{int k;public:void f() {co

2015-08-05 20:02:04 467

原创 Linux内核——伙伴系统和slab缓存

本节,我将介绍linux系统物理内存分配时所用到的技术——伙伴系统和slab缓存。    伙伴系统    使用场景:内核中很多时候要求分配连续页,为快速检测内存中的连续区域,内核采用了一种技术:伙伴系统。    原理:系统中的空闲内存总是两两分组,每组中的两个内存块称作伙伴。伙伴的分配可以是彼此独立的。但如果两个小伙伴都是空闲的,内核将其合并为一个更大的内存块,作为下一层次上某个内存块

2015-08-03 21:01:02 2165

原创 动态链接库和静态链接库的区别

本文我们学习和了解一下动态链接库和静态链接库的区别。    静态链接库(lib文件),将函数代码编译到应用程序中,应用程序运行时全部载入到内存。优点是不需要挂在dll文件,缺点是生成的应用程序比较大。    动态链接库(lib和dll文件),lib编译到应用程序中,实际函数代码写在dll中。在应用程序运行时,lib只是用来提供dll中函数的入门地址,所以需要把dll加载到进程空间,再通过l

2015-08-03 15:28:46 630

原创 C++ const关键字的总结

本文我将总结const关键字的几个常见问题,让我们更加简单和全面的理解const关键字的作用和意义。    问题1:类的const成员变量怎么初始化?    解答:类中的const成员必须(只能)在构造函数的初始化列表中进行初始化。    问题2:类的const成员函数有什么作用?    解答:防止函数对成员变量值进行修改,毕竟我们有时候只是希望函数读取变量值,而不要改变它,那么你

2015-08-03 15:12:33 656

原创 MySQL开发技巧——与Join相关的SQL技巧

在上一篇文章中,我们具体介绍了如何正确使用Join语句。这里我们将会介绍与Join相关的SQL技巧。    举例:如何更新使用过滤条件中包括自身的表?    情景:把同时存在于取经四人组和悟空兄弟表中的记录的人在取经四人组表中的id字段更新为10。    技巧:使用Join来进行联合更新。    SQL语句:

2015-08-03 10:07:17 721

原创 MySQL开发技巧——如何正确使用Join语句

SQL语言相信学过数据库的人都会使用,但是能正确使用SQL的人却相对不多。正确使用SQL很重要吗?当然,下面我就列出了正确使用SQL语句的几个好处:增加数据库的处理效率,减少相应的响应时间。减少数据库的服务器负载,增加服务器稳定性。减少服务器间通讯的网络流量。这篇文章,我将先介绍如何正确的使用Join从句    举例中使用的表如下:西天取经四人组 VS 悟空的朋友们

2015-08-03 07:51:52 1427

原创 JAVA中继承时的初始化顺序

我们都知道继承是JAVA面向对象中的一个很重要的特性。那么你有没有思考过当我们使用继承这个特性的时候,程序是如何执行的呢?也就是说,继承的初始化顺序到底是怎么样的。接下来我就要用eclipse来试验一下了。   首先,我们可以创建一个Animal的类,然后写上构造方法。      然后,再创建一个Dog类(继承自Animal类),同时也写上自己的构造方法。   我们接着在主函数里面

2015-05-23 15:23:49 2388

原创 关于JAVA里面的内部类的一些理解

关于JAVA里面内部类的全面分析和理解

2015-05-19 22:35:17 807

空空如也

空空如也

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

TA关注的人

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