rock_joker的博客

辛勤工作的小蜜蜂
私信 关注
rock_joker
码龄4年
  • 150,623
    被访问量
  • 14
    原创文章
  • 62,935
    作者排名
  • 90
    粉丝数量
  • 于 2017-02-18 加入CSDN
获得成就
  • 获得117次点赞
  • 内容获得16次评论
  • 获得161次收藏
荣誉勋章
TA的专栏
  • linux网络编程
    22篇
  • c++
    18篇
  • 数据结构与算法
    16篇
  • linux系统编程
    15篇
  • 操作系统
    2篇
  • 面试
    3篇
  • STL
    1篇
  • TCP/IP
    2篇
  • 其它
    3篇
  • Linux内核
    9篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

个人网站信息收集备忘

文章目录个人网站信息收集备忘博客网站mediumLinux相关内核[Interactive map of Linux kernel ](https://makelinux.github.io/kernel/map/)编译-L、-rpath和-rpath-link的区别x86汇编指令集大全(带注释)Shell相关[Shell - 03 深刻理解export关键字:再也不会犯迷糊](https://blog.csdn.net/weixin_38256474/article/details/90713950)DB
原创
37阅读
0评论
0点赞
发布博客于 7 月前

为什么需要使用栈结构?

在以往学习高级语言时,提到栈,下意识都会反映上来FILO,它是暂存数据的一种数据结构,但是为什么会用到栈?却一直讳莫如深,这是高级语言不会涉及到的底层的实现,最近在学习王爽老师的《汇编语言》,其中有一段点醒了我,现整理如下。(一)这个问题的由来是对如下datasg段中每个单词改写为大写字母。 assume cs:codesg,ds:datasg datasg segment db 'ibm ' db 'dec ' db 'dos ' ..
转载
218阅读
0评论
0点赞
发布博客于 7 月前

个人文章管理备忘

个人备忘个人文章管理备忘网络TCP协议疑难杂症全景解析UDP协议疑难杂症全景解析TCP的快速重传机制TCP-IP详解:超时重传机制个人文章管理备忘在阅读博客文章的过程中,遇到值得记录的文章便保存下来网络TCP协议疑难杂症全景解析UDP协议疑难杂症全景解析TCP的快速重传机制TCP-IP详解:超时重传机制...
原创
69阅读
0评论
0点赞
发布博客于 7 月前

C++11:使用 auto/decltype/result_of使代码可读易维护

C++11 终于加入了自动类型推导。以前,我们不得不使用Boost的相关组件来实现,现在,我们可以使用“原生态”的自动类型推导了!C++引入自动的类型推导,并不是在向动态语言(强类型语言又称静态类型语言,是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行。例如C/C++/Java;弱类型语言又称动态类型语言,是指不需要进行变量/对象类型声明的语言,一般情况下不需要编译(但也有编译型的)。...
转载
924阅读
1评论
1点赞
发布博客于 3 年前

二叉树的递归与非递归遍历(前序、中序、后序)

【写在前面】  二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就 是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历 中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。
转载
303阅读
0评论
0点赞
发布博客于 4 年前

Redis的使用场景

redis和mysql要根据具体业务场景去选型mysql:数据放在磁盘redis:数据放在内存redis适合放一些频繁使用,比较热的数据,因为是放在内存中,读写速度都非常快,一般会应用在下面一些场景排行榜计数器消息队列推送好友关注,粉丝实现共同关注的功能:本质上是计算连个用户关注的交集,如果使用关系型数据库,它并不支持交集计算工作,要计算两个集合的交集,
原创
253阅读
0评论
0点赞
发布博客于 4 年前

C++栈的用法及栈的实现

首先看一下原c++栈的方法的基本用法: push(): 向栈内压入一个成员;pop(): 从栈顶弹出一个成员;empty(): 如果栈为空返回true,否则返回false;top(): 返回栈顶,但不删除成员;size(): 返回栈内元素的大小;代码示例:#include#includeusing namespace std;int main(){ stack i
转载
904阅读
0评论
0点赞
发布博客于 4 年前

ELF格式与bss段

ELF(Executable Linkable Format)是Linux系统下的一种可执行可链接文件的格式,是COFF格式的变种。在Linux系统中包括了可重定位文件(.o文件),可执行文件(/bin/bash文件),共享目标文件(.so)和核心转储文件(core dump)。ELF文件头(ELF Header):位于ELF文件的头部,包含了描述整个文件的基本属性。代码段(.text):
原创
1252阅读
0评论
0点赞
发布博客于 4 年前

linux后台开发具备能力集锦

Linux后台开发应该具备技能一、linux和os:1、命令:netstat tcpdump ipcs ipcrm  这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验2、cpu 内存 硬盘 等等与系统性能调试相关的命令必须熟练掌握,设置修改权限 tcp网络状态查看 各进程状态 抓包相关等相关命令 必须熟练掌握3、awk sed需掌握4、共享内存的
原创
1058阅读
0评论
0点赞
发布博客于 4 年前

linux内核学习之进程和线程

Linux进程、线程问题2010年8月15日,今天研究的是linux的进程管理,昨天是内存寻址,感慨颇深啊,《深入理解Linux内核》这本书真是浪得虚名,根本没有说到问题的本质,一些概念的由来、定义、区别以及联系,技术的原理,运行过程,整体结构,各部分衔接等等问题统统没有说明白,甚至根本没说,全书都是Linux的数据结构,及各种变量,接口函数,却根本没说是什么,为什么。对于新手来说简直是灾难,
转载
348阅读
0评论
0点赞
发布博客于 4 年前

线性时间排序(计数排序、基数排序、桶排序)

转载:http://blog.csdn.net/luoshixian099/article/details/45043337线性时间排序  前面介绍的几种排序,都是能够在复杂度nlg(n)时间内排序n个数的算法,这些算法都是通过比较来决定它们的顺序,这类算法叫做比较排序 。下面介绍的几种算法用运算去排序,且它们的复杂度是线性时间。——————————————————————
转载
383阅读
0评论
0点赞
发布博客于 4 年前

Linux虚拟地址空间布局以及进程栈和线程栈总结

一:Linux虚拟地址空间布局(转自:Linux虚拟地址空间布局)  在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块。在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3,而Windows系统为2:2(通过设置Large-Addres
转载
271阅读
0评论
0点赞
发布博客于 4 年前

高并发解决方案

一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是
转载
172阅读
0评论
0点赞
发布博客于 4 年前

SQL SERVE的聚集索引与非聚集索引

通俗的解释聚集索引:       聚集索引,来源于生活尝试。这中索引可以说是按照数据的物理存储进行划分的。对于一堆记录来说,使用聚集索引就是对这堆记录 进行 堆划分。即主要描述的是物理上的存储。举个例子:       比如图书馆新进了一批书。那么这些书需要放到图书馆内。书如何放呢?一般都有一个规则,杂志类的放到101房间,文学类的放到102房间,理工类的放到103房
原创
214阅读
0评论
0点赞
发布博客于 4 年前

Linux中虚拟内存和物理内存的关系

首先,让我们看下虚拟内存:第一层理解1.         每个进程都有自己独立的4G内存空间,各个进程的内存空间具有类似的结构2.       一个新进程建立的时候,将会建立起自己的内存空间,此进程的数据,代码等从磁盘拷贝到自己的进程空间,哪些数据在哪里,都由进程控制表中的task_struct记录,task_struct中记录中一条链表,记录中内存空间的分
转载
517阅读
0评论
1点赞
发布博客于 4 年前

TCP协议详解(慢启动,流量控制,阻塞控制之类)

UDP协议提供了端到端之间的通讯,应用程序只需要在系统中监听一个端口,便可以进行网络通讯。随着计算机网络的发展,计算机网络所承载的业务越来越多,有些业务数据的传输需要具备可靠性,譬如我们在进行在线聊天的时候,我们发送的一条消息,我们必须明确地知道对方是否收到。如果对方对我们发送地消息不给予确认,我们就不知道对方是否已经收到。显然,UDP协议并没有提供可靠交付的能力,因此我们可能需要在应用层
转载
10768阅读
0评论
3点赞
发布博客于 4 年前

TCP之性能优化避免慢启动

TCP协议中有个慢启动,在《TCP/IP详解卷一》中占据的篇幅很小,但是这个东西,在某些业务场景下,对性能的影响非常大。什么是慢启动最初的TCP的实现方式是,在连接建立成功后便会向网络中发送大尺寸的数据包,假如网络出现问题,很多这样的大包会积攒在路由器上,很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此现在的TCP协议规定了,新建立的连接不能够一开始就发送大尺寸的数据包,而只能从
转载
757阅读
0评论
0点赞
发布博客于 4 年前

linux内核--段页式管理内存的方法

一、概念物理地址(physical address)用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不
转载
790阅读
0评论
0点赞
发布博客于 4 年前

linux网络编程--TCP分包 粘包 MTU 和MSS之间的关系分析

其实在以前的文章中介绍了和这个话题相关的文章,TCP封包。这里还想继续回顾想以前的内容,把不明白的东西弄明白:        IP分片在以太网上,由于电气限制,一帧不能超过1518字节,除去以太网帧头14字节(mac地址等)和帧尾4字节校验,还剩1500字节,这个大小称为MTU(最大传输单元)。如果你的IP包大于1500字节,IP层就会分片了。而1492的MTU值的来源
转载
259阅读
0评论
0点赞
发布博客于 4 年前

再次深入理解TCP网络编程中的send和recv(TCP传输的一般过程抓包演示)

本篇我们用一个测试机上的阻塞socket实例来说明主题。文章中所有图都是在测试系统上现截取的。需要理解的3个概念1. TCP socket的buffer每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用r
转载
646阅读
0评论
0点赞
发布博客于 4 年前

linux网络编程--深入浅出send和recv

先明确一个概念:每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用read进行读取的话,此数据会一直缓存在相应 socket的接收缓冲区内。再啰嗦一点,不管进程是否读取socket,对端发来的数据都会经由内核接收并且缓存到
转载
393阅读
0评论
0点赞
发布博客于 4 年前

linux 中IO多路复用epoll函数的ET和LT工作模式详解

epoll的优点:1.支持一个进程打开大数目的socket描述符(FD)    select 最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是2048。对于那些需要支持的上万连接数目的IM服务器来说显然太少了。这时候你一是可以选择修改这个宏然后重新编译内核,不过资料也同时指出这样会带来网络效率的下降,二是可以选择多进程的解决方案(传统的 Apach
转载
396阅读
0评论
0点赞
发布博客于 4 年前

epoll机制:epoll_create、epoll_ctl、epoll_wait、close用法详解

在Linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,linux/posix_types.h头文件有这样的声明:#define__FD_S
转载
17064阅读
1评论
8点赞
发布博客于 4 年前

linux守护进程的详解与创建

写在前面,守护进程与后台进程的区别:后台进程:默认情况下,进程是在前台运行的,但是在运行的时候使用特殊操作使前台运行的程序放置后台运行,但是如果这个进程所依附的shell终结,就是在后台运行的程序也会被终止。守护进程:类似于一种服务,在开机启动的时候会自动启动,或者通过程序写一个守护进程,下面有讲解关于后台进程的书写规范;还可以通过命令来启动一个后太进程。即使所有的shell都关闭
转载
260阅读
0评论
0点赞
发布博客于 4 年前

孤儿进程与僵尸进程[总结]

孤儿进程与僵尸进程[总结]1、前言  之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上面,没有深入,倍感惭愧。晚上回来google了一下,再次参考APUE,认真总结一下,加深理解。2、基本概念  我们知道在unix/linux中,正常情况
转载
161阅读
0评论
0点赞
发布博客于 4 年前

linux网络编程--TCP分包 粘包 MTU 和MSS之间的关系分析

其实在以前的文章中介绍了和这个话题相关的文章,TCP封包。这里还想继续回顾想以前的内容,把不明白的东西弄明白:        IP分片在以太网上,由于电气限制,一帧不能超过1518字节,除去以太网帧头14字节(mac地址等)和帧尾4字节校验,还剩1500字节,这个大小称为MTU(最大传输单元)。如果你的IP包大于1500字节,IP层就会分片了。而1492的MTU值的来源
转载
213阅读
0评论
0点赞
发布博客于 4 年前

linux网络编程--shut_down和close()函数的区别

在Linux C网络编程中,一共有两种方法来关闭一个已经连接好的网络通信,它们就是close函数和shutdown函数,它们的函数原型分别为:1#include2int close(intsockfd)3//返回:0——成功, 1——失败4
转载
326阅读
0评论
0点赞
发布博客于 4 年前

epoll使用方法&简单原理介绍&详细的select/poll/epoll对比

一、 介绍    Epoll 是一种高效的管理socket的模型,相对于select和poll来说具有更高的效率和易用性。传统的select以及poll的效率会因为 socket数量的线形递增而导致呈二次乃至三次方的下降,而epoll的性能不会随socket数量增加而下降。标准的linux-2.4.20内核不支持epoll,需要打patch。本文主要从linux-2.4.32和linux-2.
转载
1453阅读
0评论
1点赞
发布博客于 4 年前

结合内核实现源码分析 select poll epoll区别

在博客中以前的文章有介绍epoll的使用方法,但是并没有详细介绍之间的区别http://blog.csdn.net/yusiguyuan/article/details/15027821http://blog.csdn.net/yusiguyuan/article/details/15029465http://blog.csdn.net/yusiguyuan/article
转载
240阅读
0评论
0点赞
发布博客于 4 年前

epoll大致结构

设想一个场景:有100万用户同时与一个进程保持着TCP连接,而每一个时刻只有几十个或几百个TCP连接时活跃的(接收到TCP包),也就是说,在每一时刻,进程值需要处理这100万连接中的一小部分连接。那么,如何才能高效地处理这种场景呢?进程是否在每次询问操作系统收集有事件发生的TCP连接时,把这100万个连接告诉操作系统,然后由操作系统找出其中有事件发生的几百个连接呢?实际上,在Linux内核2.4版
转载
382阅读
0评论
0点赞
发布博客于 4 年前

epoll模型讲解/源码分析

epoll模型在select/poll出现之前我们只能通过read/write的IO操作来从流中读取数据,当然在少量IO操作的时候完全是可靠的,但是当IO操作快速增长时甚至到了大规模并发阶段,这样的IO就显得捉襟见肘了。 首先我们来理解一个内核缓冲区的概念,假设A,B两个分别作为写入方与读出方,假设一开始内核缓冲区是空的,B作为读出方,被阻塞着。然后首先A往管道写入,这时候内核缓冲区由
转载
381阅读
0评论
0点赞
发布博客于 4 年前

Linux内存管理slab分配器

slab出现的缘由在Solaris 2.4以前,Linux内核采用基于伙伴算法实现的分区页框分配器适合大块内存的请求。伙伴将空闲页面分为m个组,第1组存储2^0个单位的内存块,,第2组存储2^1个单位的内存块,第3组存储2^2个单位的内存块,第4组存储2^3个单位的内存块,以此类推.直到m组.但是伙伴算法是以页为单位分配的,即会产生内部碎片,slab算法的出现就是为了解决这个小粒度内存分配
转载
146阅读
0评论
0点赞
发布博客于 4 年前

同步/异步与阻塞非阻塞的关系

一、“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由
转载
113阅读
0评论
0点赞
发布博客于 4 年前

序列化、反序列化与jsoncpp学习

json是序列化与反序列化的一种方式。1. 什么叫序列化和反序列化?用途是什么?把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 2) 在网络上传送对象的字节序列。 对象的序列化主要有两种用途:   在很多应用中,需要对某些对象进行序列化,让它们离开内存
转载
306阅读
0评论
0点赞
发布博客于 4 年前

关于C++中的虚拟继承的一些总结

1.为什么要引入虚拟继承虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下:class Aclass B1:public virtual A;class B2:public virtual A;
转载
128阅读
0评论
0点赞
发布博客于 4 年前

堆排序中建堆过程的时间复杂度O(n)的证明

下面是建立大根堆的代码[cpp] view plain copy print?template typename Type>  void CreateBigRootHeap(Type *array, int len)  {      int i, j, k;      Type temp;        for (i = (len - 1) / 2; i >
转载
942阅读
0评论
0点赞
发布博客于 4 年前

面试算法之排序算法集锦

排序算法在面试过程中是经常会考的,这是很基础的,面试官觉得你应该很熟悉这些东西,如果你半个小时内写不出来,那基本就给跪了,因为这真的是狠基础狠基础的东西,所以我们得对一些基本的排序算法烂熟于胸,对这些排序思想,效率了如指掌,才能让面试官觉得你还行。基本的排序算法有:直接插入排序,冒泡排序,简单选择排序,shell排序,归并排序,快速排序,堆排序。其中归并,快速,堆排序是面试时候比较喜欢考的,因为这
转载
204阅读
0评论
0点赞
发布博客于 4 年前

C++静态初始化的顺序

这两天项目代码中遇到一个很疑惑的问题,问题可以描述为: 一个静态成员初始化的时候直接core掉,该静态成员初始化时通过另外一个文件中静态成员来完成 。该问题同样发生在全局对象上。该问题可以描述为今天要讨论的:变量的静态初始化顺序 。 具体可以用代码简述如下://test1.cpp#include std :: string a = "test";
转载
542阅读
1评论
1点赞
发布博客于 4 年前

Linux下core文件调试方法

Linux下core文件调试方法在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。1.core文件的生成开关和大小限制 (1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。 (2)
转载
144阅读
0评论
0点赞
发布博客于 4 年前

理解虚拟函数、多继承、虚继承和RTTI所需的代价

C++编译器们必须实现语言的每一个特性。这些实现的细节当然是由编译器来决定的,并且不同的编译器有不同的方法实现语言的特性。在多数情况下,你不用关心这些事情。然而有些特性的实现对对象大小和其成员函数执行速度有很大的影响,所以对于这些特性有一个基本的了解,知道编译器可能在背后做了些什么,就显得很重要。这种特性中最重要的例子是虚拟函数。当调用一个虚拟函数时,被执行的代码必须与调用函数的对象的动态
转载
201阅读
0评论
1点赞
发布博客于 4 年前

什么时候要用虚析构函数?

什么时候要用虚析构函数?通过基类的指针来删除派生类的对象时,基类的析构函数应该是虚的。否则其删除效果将无法实现。一般情况下,这样的删除只能够删除基类对象,而不能删除子类对象,形成了删除一半形象,从而千万内存泄漏。原因:在公有继承中,基类对派生类及其对象的操作,只能影响到那些从基类继承下来的成员。如果想要用基类对非继承成员进行操作,则要把基类的这个操作(函数)定义为虚函数。那么,
转载
1027阅读
0评论
0点赞
发布博客于 4 年前

关于基类和派生类的构造函数和析构函数的执行顺序问题

C++ 派生类的析构函数的调用顺序为:A)  基类、派生类和对象成员类的析构函数 B)  派生类、对象成员类和基类的析构函数 C)  对象成员类、派生类和基类的析构函数    D)  派生类、基类和对象成员类的析构函数答案是选着B,关于派生类构造函数与基类构造函数的调用顺序问题,我们先看一下书上的说法:    《面向对象程序设计基础(第二版》李师贤等,第254页
转载
328阅读
0评论
0点赞
发布博客于 4 年前

EOF的本质

总结:EOF只是函数的一个返回值,值为十进制-1,十六进制为0xFF,本质上为函数的一个返回值,文件中并不存在EOF我们先一起来看看FILE是怎么定义的:  FILE                          File control structure for streams.  typedef struct {    short          lev
原创
1532阅读
0评论
0点赞
发布博客于 4 年前

运算符重载参数的顺序对运算是否有影响

自己脑洞了一道面试题函数的特征标有没有顺序关系?答案是有的!请看下面这个例子://declarationfriend String & operator+(const char * schar, String & st);//definationString & operator+(const char * schar, String & st){ 
转载
1773阅读
1评论
1点赞
发布博客于 4 年前

clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结

进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽象成各种数据对象:进程控制块、虚存空间、文件系统,文件I/O、信号处理函数。所以创建一个进程的过程就是这些数据对象的创建过程。  在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性,但是二者之间的通讯需要通过专门的通讯
转载
6300阅读
1评论
7点赞
发布博客于 4 年前

C++中map、hash_map、unordered_map、unordered_set通俗辨析

一、hash_map、unordered_map这两个的内部结构都是采用哈希表来实现。区别在哪里?unordered_map在C++11的时候被引入标准库了,而hash_map没有,所以建议还是使用unordered_map比较好。哈希表的好处是什么?查询平均时间是O(1)。顾名思义,unordered,就是无序了,数据是按散列函数插入到槽里面去的,数据之间无顺序可言,但是有些时候
转载
279阅读
0评论
0点赞
发布博客于 4 年前

Linux与BSD中TCP协议栈实现比较

作为两个最有名的开源操作系统,Linux和FreeBSD是网管们的首选。Linux以开放性和众多的驱动支持著称,而FreeBSD有着优良的UNIX传统,是公认的最稳定的操作系统。那么,在这两个操作系统间,该如何选择呢?幸好,我们有源码,可以从协议栈的实现中寻找答案。      TCP/IP协议栈是网络中广泛使用的事实网络通信标准。最初的TCP实现源自4.4BSDlite,在Linux兴起后,也
转载
663阅读
0评论
0点赞
发布博客于 4 年前

TCP与UDP收发的时候TCP有缓冲区还是UDP有缓冲区,使用它们时该注意什么?

(一)基础1、TCP为可靠链接,分三次握手四次释放。2、UDP为不可靠链接(二)TCP与UDP的输出每 个TCP套接口有一个发送缓冲区,可以用SO_SNDBUF套接口选项来改变这一缓冲区的大小。当应用进程调用write往套接口写数据时,内核从应用进 程缓冲区中拷贝所有数据到套接口的发送缓冲区,如果套接口发送缓冲区容不下应用程序的所有数据,或者是应用进程的缓冲区大于套接口
转载
2654阅读
0评论
0点赞
发布博客于 4 年前

TCP/IP详解--再次深入理解TCP网络编程中的send和recv

本篇我们用一个测试机上的阻塞socket实例来说明主题。文章中所有图都是在测试系统上现截取的。需要理解的3个概念1. TCP socket的buffer每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用r
转载
1146阅读
0评论
1点赞
发布博客于 4 年前

TCP/IP详解--举例明白发送/接收缓冲区、滑动窗口协议之间的关系

一个例子明白发送缓冲区、接受缓冲区、滑动窗口协议之间的关系。在上面的几篇文章中简单介绍了上述几个概念在TCP网络编程中的关系,也对应了几个基本socket系统调用的几个行为,这里再列举一个例子,由于对于每一个TCP的SOCKET来说,都有一个发送缓冲区和接受缓冲区与之对应,所以这里只做单方向交流,不做互动,在recv端不send,在send端不recv。细细揣摩其中的含义。一、re
转载
396阅读
0评论
0点赞
发布博客于 4 年前

HTTP状态码

一、200状态码:   成功2××: 成功处理了请求的状态码。   1、200 :服务器已成功处理了请求并提供了请求的网页。   2、204: 服务器成功处理了请求,但没有返回任何内容。 二、300状态码:   重定向3×× :每次请求中使用重定向不要超过 5 次。   1、301: 请求的网页已永久移动到新位置。当URLs发生变化时,使用301代码。搜索引擎索引中保存新的
转载
125阅读
0评论
0点赞
发布博客于 4 年前

常用的排序算法的时间复杂度和空间复杂度

常用的排序算法的时间复杂度和空间复杂度排序法最差时间分析平均时间复杂度稳定度空间复杂度冒泡排序O(n2)O(n2)稳定O(1)快速排序O(n2)O(n*log2n)不稳定O(log2n)~O(n)选择排序O(n2)O(n2)稳定O(1)二叉树排序O(n
转载
265阅读
0评论
0点赞
发布博客于 4 年前

STL的数据结构

1.vector      底层数据结构为数组 ,支持快速随机访问2.list           底层数据结构为双向链表,支持快速增删3.deque       底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问deque是一个双端队列(double-ended queue),也是在
转载
375阅读
0评论
0点赞
发布博客于 4 年前

mmap的实现原理和应用

很多文章分析了mmap的实现原理。从代码的逻辑来分析,总是觉没有把mmap后读写映射区域和普通的read/write联系起来。不得不产生疑问:1,普通的read/write和mmap后的映射区域的读写到底有什么区别。2, 为什么有时候会选择mmap而放弃普通的read/write。3,如果文章中的内容有不对是或者是不妥的地方,欢迎大家指正。 围绕着这两个问题分析一下,其实在考虑
转载
350阅读
0评论
0点赞
发布博客于 4 年前

教你彻底学会动态规划——进阶篇

在我的上一篇文章中已经详细讲解了动态规划的原理和如何使用动态规划解题。本篇文章,我将继续通过例子来让大家更加熟练地使用动态规划算法。    话不多说,来看如下例题,也是在动态规划里面遇到过的最频繁的一个题,本题依然来自于北大POJ:    最长公共子序列(POJ1458)    给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到
转载
1415阅读
0评论
2点赞
发布博客于 4 年前

operator 类型转换及重载

一、类型转换类型转换函数的一般形式为 :operator 类型名(){实现转换的语句}在函数名前面不能指定函数类型,函数没有参数. 如:Complex::operator double(){return m_dReal;}int main(){Complex obj(3,4);double dNum = 0.0
转载
278阅读
0评论
0点赞
发布博客于 4 年前

教你彻底学会动态规划——入门篇

动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。网上也有很多关于讲解动态规划的文章,大多都是叙述概念,讲解原理,让人觉得晦涩难懂,即使一时间看懂了,发现当自己做题的时候又会觉得无所适从。我觉得,理解算法最重要的还是在于练习,只有通过自己练习,才可以更快地提升。话不多说,接下来,下面我就通过一个
转载
36024阅读
10评论
70点赞
发布博客于 4 年前

乐观锁与悲观锁——解决并发问题

引言为什么需要锁(并发控制)?  在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。典型的冲突有:丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户A把值从6改为2,用户B把值从2改为6,则用户A丢失了他的更新。脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取
转载
161阅读
0评论
0点赞
发布博客于 4 年前

使用sizeof计算类的大小

使用sizeof计算类的大小类的sizeof大小一般是类中的所有成员的sizeof大小之和,这个就不用多说。总结1. 一个对象的大小大于等于所有非静态成员大小的总和。 2.C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1。3.如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在
转载
215阅读
0评论
0点赞
发布博客于 4 年前

数据结构之图(存储结构、遍历)

一、图的存储结构1.1 邻接矩阵    图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。    设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:        看一个实例,下图左就是一个无向图。        从上面可以看出,无向图的边数组是一
原创
196阅读
0评论
0点赞
发布博客于 4 年前

递归算法的时间复杂度

递归算法的时间复杂度终结篇  开篇前言:为什么写这篇文章?笔者目前在学习各种各样的算法,在这个过程中,频繁地碰到到递归思想和分治思想,惊讶于这两种的思想的伟大与奇妙的同时,经常要面对的一个问题就是,对于一个给定的递归算法或者用分治思想缩小问题规模的算法,如何求解这个算法的时间复杂度呢?在google过很多的博文后,感觉这些博文总结的方法,有很好优秀的地方,但是都不够全面,有感于
转载
422阅读
0评论
0点赞
发布博客于 4 年前

洛神抽牌的期望(洛神抽到黑牌继续抽直到抽到红牌)

假设牌堆里有m黑n红时洛神期望为E(m,n);首先,E(1,n)=1/(1+n)(这个很简单,抽到了就是1张,抽不到就是0张);又牌堆里有m黑n红,若第一张洛红则洛神0张,第一张为黑则化归到m-1黑n红情况,同时已经有1黑入手,因此,E(m,n)=m/(m+n)(第一张黑概率)*(1+E(m-1,n))因此,E(2,n) = 2/(2+n)*(1+1/(1+n))=2/(1+n);
原创
711阅读
0评论
0点赞
发布博客于 4 年前

二叉树题

一、某二叉树中序序列为ABCDEFG,后序序列为BDCAFGE,则前序序列是?EACBDGF 1.由后序,E是整个二叉树的根.然后在中序里划分:(BDCA)(FG) 2.后序,A是左子树的根,然后在中序里ABCD判断A没有左子树:3.同2可得:(F不知左右) 4.根据GF中序序列所知F应该为G的左节点:前序序列应为EACBDGF
原创
266阅读
0评论
0点赞
发布博客于 4 年前

堆与堆排序

堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节
转载
197阅读
0评论
0点赞
发布博客于 4 年前

拥塞避免&流量控制

拥塞避免算法拥塞避免算法是一种处理丢失分组的方法。该算法假定由于分组受到损坏引起的丢失是非常少的(远小于1%),因此分组丢失就意味着在源主机和目的主机之间的某处网络上发生了拥塞。有两种分组丢失的指示:发生超时和接收到重复的确认。如果使用超时作为拥塞指示,则需要使用一个好的RTT算法。拥塞避免算法和慢启动算法是两个目的不同、独立的算法。但是当拥塞发生时,我们希望降低分组进入网
转载
464阅读
0评论
0点赞
发布博客于 4 年前

探索软件设计模式

探索软件设计模式软件设计模式来源于Christopher Alexander的建筑学模式和对象运动。根据Alexander的观点,模式就是一个对于特定的系统的通用解决方案本身的重复。对象运动关注于将现实世界模化为软件内部的关系。基于这两个原因,软件设计模式对于真实世界的物体而言同样应当是可以重复的。这篇文章呈现了现实的世界中的非软件的模式实例,这些模式来源于《设计模式-可复用面向对
转载
884阅读
0评论
0点赞
发布博客于 4 年前

求助,C++中为什么有些函数只能用成员函数重载,而有些函数则只能用友元函数重载,其本质原因是什么?

操作符重载函数,仍然是一个成员函数。和普通的成员函数调用一样。我们知道,类的成员函数必须通过对象才可以调用,比如“[ ]” 运算符。 class test{public: int operator[](int pos);}; 要调用 [] 运算符重载成员函数,必须有一个test的对象,否则无法调用。所以它必须是成员函数。有一些运算符即可以友元,也可以用成员函数,比如 "+"。class te
原创
3095阅读
0评论
0点赞
发布博客于 4 年前

Const 重载解析(const参数重载 和 const成员函数重载)

书上和网上在很多地方都对const 的重载做了一些解释,但感觉都不是很详细。还有很多同学在不同的地方发问关于const 重载的问题,这里我又重新看了一下,做了一个简单的分析也可能有不对的地方,欢迎讨论。所谓重载,是指允许存在多个同名函数,而这些函数的参数表不同,即函数名相同但函数的签名不同。重载并不是面向对象编程的特有属性,这是因为重载是在编译阶段实现的,编译器根据函数不同的参数表,对同名函数
转载
237阅读
0评论
0点赞
发布博客于 4 年前

静态变量,全局变量,局部变量的区别

1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。从作用域看:1>全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。2>静态局部变量具有局部作用域,
转载
289阅读
0评论
0点赞
发布博客于 4 年前

malloc原理和内存碎片

当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 1、检查要访问的虚拟地址是否合法 2、查找/分配一个物理页 3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干) 4、建立映射关系(虚拟地址到物理地址) 重新执行发生缺页中断的那条指令 如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。 内存分配的原理从操作
转载
348阅读
0评论
1点赞
发布博客于 4 年前

存储管理之页式、段式、段页式存储

首先看一下“基本的存储分配方式”种类:      1.  离散分配方式的出现  由于连续分配方式会形成许多内存碎片,虽可通过“紧凑”功能将碎片合并,但会付出很大开销。于是出现离散分配方式:将一个进程直接分散地装入到许多不相邻的内存分区中。       下面主要介绍“离散分配”三种方式的基本原理以及步骤:2.
转载
2801阅读
0评论
6点赞
发布博客于 4 年前

堆和栈的区别

一、预备知识—程序的内存分配    一个由C/C++编译的程序占用的内存分为以下几个部分    1、栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等。其    操作方式类似于数据结构中的栈。    2、堆区(heap)   —   一般由程序员分配释放,   若程序员不释放,程序结束时可能由OS回    收   。注意它与数据结构中的堆是两
转载
140阅读
0评论
0点赞
发布博客于 4 年前

浏览器的一个请求从发送到返回都经历了什么,讲的越详细越好

浏览器的一个请求从发送到返回都经历了什么,讲的越详细越好我大概讲下我的答案:1、先从网络模型层面:client (浏览器)与 server 通过 http 协议通讯,http 协议属于应用层协议,http 基于 tcp 协议,所以 client 与 server 主要通过 socket 进行通讯;而 tcp 属于传输层协议、如果走 https 还需要会话层 TLS、SSL 等协议;
转载
4944阅读
0评论
1点赞
发布博客于 4 年前

如何计算时间复杂度

定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”。当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。我们常用大O表示法表示时间复杂性,注意它是某一个算法的时间复杂性。大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界
原创
424阅读
0评论
0点赞
发布博客于 4 年前

socketpair理解

今天跟人谈到socketpair的问题,晚上回来写了个程序验证下自己的猜测!     先说说我的理解:socketpair创建了一对无名的套接字描述符(只能在AF_UNIX域中使用),描述符存储于一个二元数组,eg. s[2] .这对套接字可以进行双工通信,每一个描述符既可以读也可以写。这个在同一个进程中也可以进行通信,向s[0]中写入,就可以从s[1]中读取(只能从s[1]中读取),也可
转载
223阅读
0评论
1点赞
发布博客于 4 年前

系统中断与SA_RESTART

今天在调试程序时,sem_timedwait居然返回了一个Interrupted system call,错误码为EINTR。系统中断这东西我一向只闻其名,不见其"人",不想今天遇上了,脑中一片空白,赶紧上网恶补一下。系统中断,要从慢系统调用(slow system call)说起,请参考 http://blog.csdn.net/benkaoya/article/details/1726
转载
1104阅读
0评论
0点赞
发布博客于 4 年前

C/C++中extern关键字详解

1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。      也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而
转载
131阅读
0评论
0点赞
发布博客于 4 年前

Linux信号量 sem_t简介

函数介绍#include信号量的数据类型为结构sem_t,它本质上是一个长整型的数。函数sem_init()用来初始化一个信号量。它的原型为:int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));sem为指向信号量结构的一个指针;pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线
转载
413阅读
0评论
0点赞
发布博客于 4 年前

setsockopt中参数之SO_REUSEADDR的意义

1、一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。    SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态2、
转载
184阅读
0评论
0点赞
发布博客于 4 年前

Linux高性能服务器编程——I/O复用

IO复用I/O复用使得程序能同时监听多个文件描述符,通常网络程序在下列情况下需要使用I/O复用技术:客户端程序要同时处理多个socket客户端程序要同时处理用户输入和网络连接TCP服务器要同时处理监听socket和连接socket,这是I/O复用使用最多的场合服务器要同时处理TCP请求和UDP请求。比如本章将要讨论的会社服务器服务器要同时监听多个端口,或
转载
310阅读
0评论
0点赞
发布博客于 4 年前

Socket描述符选项[SOL_SOCKET]

Socket描述符选项[SOL_SOCKET] #include      int setsockopt( int socket, int level, int option_name,                         const void *option_value, size_t option_len); 
转载
174阅读
0评论
0点赞
发布博客于 4 年前

教你如何迅速秒杀掉:99%的海量数据处理面试题

教你如何迅速秒杀掉:99%的海量数据处理面试题本文经过大量细致的优化后,收录于我的新书《编程之法》第六章中,新书目前已上架京东/当当/亚马逊作者:July出处:结构之法算法之道blog前言   一般而言,标题含有“秒杀”,“99%”,“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲,如果读者读罢此文
转载
159阅读
0评论
0点赞
发布博客于 4 年前

十道海量数据处理面试题与十个方法大总结

海量数据处理:十道面试题与十个海量数据处理方法总结作者:July、youwang、yanxionglu。时间:二零一一年三月二十六日本文之总结:教你如何迅速秒杀掉:99%的海量数据处理面试题。有任何问题,欢迎随时交流、指正。出处:http://blog.csdn.net/v_JULY_v。 第一部分、十道海量数据处理面试题1、海量日志数据
转载
251阅读
0评论
0点赞
发布博客于 4 年前

TCP传输小数据包效率问题(译自MSDN)

TCP传输小数据包效率问题(译自MSDN)http://www.ftpff.com/blog/?q=node/16 摘要:当使用TCP传输小型数据包时,程序的设计是相当重要的。如果在设计方案中不对TCP数据包的延迟应答,Nagle算法,Winsock缓冲作用引起重视,将会严重影响程序的性能。这篇文章讨论了这些问题,列举了两个案例,给出了一些传输小数据包的优化设计方案。背景:
转载
202阅读
0评论
0点赞
发布博客于 4 年前

移动构造函数和移动赋值运算符

如果第二个对象是在复制或赋值结束后被销毁的临时对象,则调用移动构造函数和移动赋值运算符,这样的好处是避免深度复制,提高效率。为了直观地观察移动构造函数和移动赋值运算符的运行方式,编写一个类Pointer,该类的对象会在堆动态创建一个数组。代码如下:[cpp] view plain copyclass Pointer  {  pub
转载
263阅读
0评论
0点赞
发布博客于 4 年前

结构体传输 & TCP粘包处理

一、网络传输struct类型数据在网络通讯过程中往往涉及一些有关联的参数传递,例如结构体之类的。对于结构体其实方法挺简单,由于结构体对象在内存中分配的空间都是连续的,所以可以将整个结构体直接转化成字符串发送,到了接收方再将这个字符串还原成结构体就可以了。网络传输struct数据的约束有两个:约束一、就是结构体的大小必须是固定的,不能含有可变大小数据,例如CString、string
原创
3698阅读
0评论
1点赞
发布博客于 4 年前

Linux堆内存管理深入分析(下)

0、前言回顾我们在上一篇文章中(Linux堆内存管理深入分析(上)),详细介绍了堆内存管理中涉及到的基本概念以及相互关系,同时也着重介绍了堆中chunk分配和释放策略中使用到的隐式链表技术。通过前面的介绍,我们知道使用隐式链表来管理内存chunk总会涉及到内存的遍历,效率极低。对此glibc malloc引入了显示链表技术来提高堆内存分配和释放的效率。所谓的显示链表就是我们在数
转载
391阅读
0评论
1点赞
发布博客于 4 年前

Linux堆内存管理深入分析(上)

0、前言近年来,漏洞挖掘越来越火,各种漏洞挖掘、利用的分析文章层出不穷。从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种。国内关于栈溢出的资料相对较多,这里就不累述了,但是关于堆溢出的漏洞利用资料就很少了。鄙人以为主要是堆溢出漏洞的门槛较高,需要先吃透相应操作系统的堆内存管理机制,而这部分内容一直是一个难点。因此本系列文章主要从Linux系统堆内存管理机制出发,逐步介绍诸
转载
751阅读
0评论
0点赞
发布博客于 4 年前

一步一步写平衡二叉树(AVL树)

第一次转载:http://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html第二次转载:http://blog.csdn.net/niteip/article/details/11840691/       (可能有错误,可以在这里找)平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引
转载
171阅读
0评论
0点赞
发布博客于 4 年前

轻松搞定面试中的二叉树题目

版权所有,转载请注明出处,谢谢!http://blog.csdn.net/walkinginthewind/article/details/7518888树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关
转载
406阅读
0评论
0点赞
发布博客于 4 年前

移动构造函数和移动赋值运算符

如果第二个对象是在复制或赋值结束后被销毁的临时对象,则调用移动构造函数和移动赋值运算符,这样的好处是避免深度复制,提高效率。为了直观地观察移动构造函数和移动赋值运算符的运行方式,编写一个类Pointer,该类的对象会在堆动态创建一个数组。代码如下:[cpp] view plain copyclass Pointer  {  pub
转载
332阅读
0评论
0点赞
发布博客于 4 年前

看完这个你还不理解右值引用和移动构造 你就可以来咬我(下)

共分三篇,这是第一篇。另外两篇,看完这个你还不理解右值引用和移动构造 你就可以来咬我(上),看完这个你还不理解右值引用和移动构造 你就可以来咬我(中)。下面是新标准下的其他特性(共十点),了解一下,总有用上的时候。转载 ::http://blog.csdn.net/yapian8/article/details/42341351C++11 新特性分析
转载
386阅读
0评论
1点赞
发布博客于 4 年前

看完这个你还不理解右值引用和移动构造 你就可以来咬我(中)

共分三篇,这是第一篇。另外两篇,看完这个你还不理解右值引用和移动构造 你就可以来咬我(上),看完这个你还不理解右值引用和移动构造 你就可以来咬我(下)。看完上篇,应该对右值引用和移动构造有了总体上的概念,下面是一篇更加形象更加详细的论述。看完之后,相信你一定会对这个问题产生深入的理解和自己的认识。另一个版本的右值引用叙述右值引用解决的
转载
443阅读
0评论
1点赞
发布博客于 4 年前

看完这个你还不理解右值引用和移动构造 你就可以来咬我(上)

共分三篇,这是第一篇。另外两篇,看完这个你还不理解右值引用和移动构造 你就可以来咬我(中),看完这个你还不理解右值引用和移动构造 你就可以来咬我(下)。C++ 右值引用 & 新特性C++ 11中引入的一个非常重要的概念就是右值引用。理解右值引用是学习“移动语义”(move semantics)的基础。而要理解右值引用,就必须先区分
转载
800阅读
0评论
2点赞
发布博客于 4 年前

Send的基本规则 & 能否多个进程或线程同时向同一个Socket传递数据

一、Socket中send的普通执行流程。     当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的长度,     (1) 如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;     (2) 如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,就是等待协议把数据发送完     (3) 如
原创
9919阅读
1评论
2点赞
发布博客于 4 年前