随笔分类 - 程序运行原理
探究程序的运行机制
摘要:1. 同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。(阻塞)2. 同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可以立即返回,但是并不保证I/O操作成功。(立即返回)3. 异步事件阻塞I/O: 用户进程可以对I/O事件进行阻塞,但是...
阅读全文
摘要:摘要:使用友元、私有构造函数、虚继承等方式可以使一个类不能被继承,可是为什么必须是虚继承?背后的原理又是什么?用C++实现一个不能被继承的类(例1) 1 #include 2 using namespace std; 3 4 template 5 class Base{ 6 frie...
阅读全文
摘要:正常通信的情况下,send函数发送成功会返回发送数据的字节数。当有错误发生时,send返回-1,全局变量errno被设置。很多情况下,send返回-1是由于连接被对端关闭(对端发送了RST或者FIN包),这种情况errno会被设置为ECONNRESET(Connection reset by pee...
阅读全文
摘要:在linux中使用c语言编程时,errno是个很有用的动动。他可以把最后一次调用c的方法的错误代码保留。但是如果最后一次成功的调用c的方法,errno不会改变。因此,只有在c语言函数返回值异常时,再检测errno。errno会返回一个数字,每个数字代表一个错误类型。详细的可以查看头文件。/usr/i...
阅读全文
摘要:字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。 这种算法不太容易理解,网上有很多解...
阅读全文
摘要:C++语言的对象化模型.封装,隐藏内部实现.继承,复用现有代码.多态,改写对象行为本文描述了一个C++实现的继承和多态的场景,然后用C语言编写了一种对等的实现。// A typical example of inheritance and virtual function use.// We wou...
阅读全文
摘要:引用和指针有如下三种区别:1 引用必须在声明时初始化,而指针不用;2 对于NULL不能引用,而指针可以指向NULL;3 引用一旦声明,引用的对象不能改变(但对象的值可以改变);而指针可以随时改变指向的对象。引用能做到的,指针也可以,但指针更危险;(1)引用被创建的同时必须被初始化(指针则可以在任何时...
阅读全文
摘要:表1.常用的元字符代码说明.匹配除换行符以外的任意字符\w匹配字母或数字或下划线或汉字\s匹配任意的空白符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]\d匹配数字\b匹配单词的开始或结束^匹配字符串的开始$匹配字符串的结束表2.常用的限定符代码/语法说明*重复零次或更多次+重复一...
阅读全文
摘要:二维数组意义:int **Ptr 表示指向"一群"指向整数的指针的指针。int *Ptr[ 5 ] 表示指向 5 个指向整数的指针的指针,或者说Ptr有5个指向"一群"整数的指针,Ptr是这5个指针构成的数组的地址int ( *Ptr )[ 5 ] 表示指向"一群"指向 5 个整数数组的指针的指针。...
阅读全文
摘要:1、对象已死? 垃圾回收是对堆中对象的管理,首先就要确定什么是垃圾,即什么情况下堆中的对象可以被回收。最常用的判定算法是引用计数算法,即每当有一个对象被其它对象所引用,则将对象的引用数+1,当对象的引用数为0时,则认为对象将不再被使用,可以回收。但引用计数算法有一个缺陷,即无法解决对象循环引用的问题。当对象相互引用时,将会给引用的双方的对象的引用计数+1,这样的话对象的引用计数将一直无法被清零,也即是说,GC(Garbage Collection)无法判定对象为可回收对象,该对象将一直占据在内存中无法被释放。 Java中使用的判定算法为根搜索算法(GC Roots Tracing),这个算法.
阅读全文
摘要:首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(地址地)。下图为典型的存取器安排,观察栈在其中的位置入栈操作:push eax; 等价于 esp=esp-4,eax->[esp];如下图出栈操作:pop eax; 等价于 [esp]->eax,esp=esp+4;如下图我们来看下面这个C程序在执行过程中,栈的变化情况void func(int m, int n) { int a, b; a = m; b = n;}main() {.
阅读全文
摘要:一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) :一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。注malloc,calloc,new申请的内存均位于此区。3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。4、文字常量区 :常量字符串就是放在这里的。程序结束后由系统释放。5、程序代码区:存放函数体的
阅读全文

浙公网安备 33010602011771号