01 2013 档案
摘要:问题1:字符数组名可以作为左值吗?当然不行比如char str[20] = {'h','e','l','l','o',' ','w','o','r','l','d'};str++;不可以这么干,因为字符数组名是一个常量指针,也就是是一个const char*#include <stdio.h>int main(){ char str[20] = {'h','e','l&
阅读全文
摘要:2012年7月份,我来到了爱立信实习,那个时候对于实习生活很憧憬,因为这是我第一次迈入社会,第一次来到上海,开始自己的程序员生涯的第一站。 来到爱立信的第一天,我清晰的记得当时有好多的实习生来报道,有认识的,也有不认识的,接着大家被分到不同的部门,刚进入自己的部门时,感觉公司的工作环境好温馨,灯光通明,有咖啡厅,有免费的咖啡喝,虽然我只喝了几次,接着我被我的manager领到自己的team中去认识大家,我的team名叫flute,哈哈,我也有了自己的mentor,当时和team里面的人一一握手的时候还不好意思。 第二天我的实习开始正式开始。因为刚开始由于位子比较紧,所以我和其他两个实习...
阅读全文
摘要:socket是什么?socket描述符和文件描述符有什么联系吗?我们都知道我们可以用read和write来操作socket描述符,所以我想其实socket描述符其实就是文件描述符
阅读全文
摘要:讲到ipv4如何兼容ipv6,我觉得首先得介绍一个函数,getaddrinfo()头文件: #include <sys/types.h> #include <sys/socket.h> #include <netdb.h>函数原型: int getaddrinfo(const char *node, //identify an Internet host const char *service, //identifya service const struct addrinfo *hints, ...
阅读全文
摘要:我们在进行网络编程的时候,有时候会遇到字节序转换的问题,为什么呢?因为我们都知道计算机对于数据的存储有两种方式,一种是大端模式,一种是小端模式,但是我们数据在网络上传输都是大端模式,这是为了统一。当我们发送端主机是小端模式时,我们要将主机的小端模式的字节序转换成网络的大端模式当我们接收端主机是小端模式时,我们要将网络的大端模式转换为接收端主机的小端模式当我们发送端主机是大端模式时,我们无需进行转换当我们接收端主机是大端模式时,我们也无需进行转换htonl() 将主机字节序转换为网络字节序 longntohl() 将网络字节序转换为主机字节序 longhtons() 将主机字节序转换为网络字节序
阅读全文
摘要:http://www.ibm.com/developerworks/cn/linux/l-cn-ipv4v6-sockapp/index.htmlhttp://xfaithfishx.blog.163.com/blog/static/18592203920097251440234/http://www.doc88.com/p-190266011060.html
阅读全文
摘要:关于关系操作符(in, not in):l = [1,2,3,4]2 in l///True5 in l///False5 not in l///True关于连接操作符(+):允许将两个列表,元组,字典,字符串连接l1 = [1,2,3,4]l2 = [5,6,7,8]l = l1+l2///l = [1,2,3,4,5,6,7,8]l1 = (1,2,3,4)l2 = (5,6,7,8)l =l1 + l2///l = (1,2,3,4,5,6,7,8)str1 = 'str1'str2 = 'str2'str = str1 + str2///str = &#
阅读全文
摘要:关于python对象的三个特性:身份:python每个对象都有一个唯一标示符标示自己,这个标示符其实就是对象的内存地址,可以通过id()来得到类型:可以通过type()来得到值:关于python布尔逻辑操作符:and即是&&or即是||not即是!还有一个is,表示两个python对象是不是同一个地址。a = 1, b = aa is b///True注: Python中的整型对象和字符串对象是不可变对象,Python的变量都指针都是指向的同一个对象,比如: a = 4;b = 4;a is b #输出True id(a) == id(b) 为True a = 'abc
阅读全文
摘要:记住年三十给老师发份邮件祝福一下,我的校内导师,手机短信也行
阅读全文
摘要:http://www.ibm.com/developerworks/cn/linux/l-memory-leaks/
阅读全文
摘要:今天突然想看一下linux下的多线程编程,对于多线程编程也有自己的理解,比如多个线程共享所在进程的所有资源,当然对这些资源的访问,有些时候需要我们互斥访问,所以得有线程锁,有时候可能我们需要线程间同步,那么就需要我们使用条件变量和信号量等等,多个线程每个线程都有一个线程栈,用来保存每个线程独有的状态转换,当然这些线程栈都是在进程的地址空间内,只不过他们的地址相互独立而已,当然如果我们能知道其他线程的地址,我们也可以非法去访问其他线程的内部变量。首先我想先介绍关于pthread线程库的一些东西:头文件:#include <pthread.h>函数原形:int pthread_crea
阅读全文
摘要:对于多线程编程,我们有时候会遇到多个线程需要互斥访问同一个资源的问题,或者是线程间同步的问题,比如生存者和消费者,下面我就来讲讲多线程编程中的同步和互斥的问题。1:互斥锁当有一个链表,这个链表需要两个线程互斥访问时,我们就需要互斥锁。为什么呢?因为当一个线程要去使用这个链表时,首先他得先获得锁,一旦发现锁已经被别的线程占用,则无法获得锁将阻塞等待互斥锁被别人解锁,当然也有办法不阻塞,一旦无法获得锁,则直接返回。如何初始化锁:函数原型: int pthread_mutex_init (pthread_mutex_t*mutex,constpthread_mutexattr_t* mutexatt
阅读全文
摘要:方法一:最笨的方法,遍历链表1,每遍历一个节点,判断这个节点是否在链表2中for node1 in l1 for node2 in l2 if node1 == node2 return True时间复杂度比较高,O(l1.length*l2.length)方法二:万能的hash,对于节点地址进行hash到不同的桶中,首先将l1的所有节点的地址hash到不同的桶中,然后对l2的每个节点,将它的节点地址hash到不同的桶中,一旦发现两个节点hash到相同的桶中,说明节点地址有相同,则相交。时间复杂度:O(l1.length+l2.length)方案三:如果两个链表中的相交,必然...
阅读全文
摘要:关于反斜杠:\ 和c++上差不多,都是继续上一行关于赋值:多元赋值,x,y,z=1,2,'hello world'///x = 1, y = 2, z = 'hello world'关于交换:x=1,y=2x,y = y,x/// y=1,x=2python一个简单的模板:#!/usr/bin/env python"this is a class module"import sysdebug = Trueclass Test: "Test class" passdef test(): "test function
阅读全文
摘要:问题一:为什么想离开现在的公司?你考虑的是什么?你在意什么?首先在爱立信这边的话,实习还是挺轻松的,但这不是我想要的生活,我喜欢有乐趣性的工作,在工作中会遇到各种各样的问题,然后去解决这些问题,在爱立信那边也实习了很久,北欧的公司,确实很人性,其实真的要离开的话,还是有一点舍不得,不管是那边一共进入的实习生,还是帮我过的正式员工,大家一起出去玩,也留下了很好的回忆。还有我觉得现在通信行业前景迷茫,而互联网蓬勃发展,这也是我想进入互联网行业的原因,还有我觉得盛大是一家好公司,我能够学到更多的东西,而且我觉得盛大这边我肯定能学到更多的东西,当然待遇也是我考虑的一个原因。问题二:公司加班比较多,你对
阅读全文
摘要:前些日子,写过一个普通的智能指针,模拟的是boost中的auto_ptr,今天又写了一个关于boost中的share_ptr,引用计数器智能指针,感觉还行,功能基本实现,设计思想基本上是这么一回事,智能指针类管理资源,引用计数器类管理是否有多个智能指针指向同一个资源,如果有为这个资源设一个引用计数器,计数器值表示有多少个智能指针在使用这个资源,一旦有一个智能指针准备释放这个资源,仅仅对计数器减一,只有当没有智能指针指向这个资源,才真正的释放资源,当然你也可以强制让所有的智能指针释放这个资源,直接delete掉资源,然后将所有的智能指针delete掉。下面是我代码:#include <io
阅读全文
摘要:身为一个程序员,我个人很喜欢早洗澡的时候去思考一些技术上的东西,今天有人问我什么是面向对象,其实我也不是很懂,我以前一直认为面向对象就是继承,而继承就是虚函数,但是我洗澡的时候在思考,真的是这样子的吗?错了,不管虚函数的机制是为了继承和多态而服务,而继承和多态确实为了OO的思想而服务,怎么说呢?我们都知道,当我们都知道学生A,B,C,D.....,都是学生,并且他们有一些共同的属性,比如年龄,性别,学号。。。,如果在面向过程的编程模式中,我们可能要为每一个学生建立一个存放他/她属性的一个东西,而面向对象呢,我们只要将他们共同的东西抽象出来形成一个类,而类中只有他的属性,那么我们只要使用这个类去
阅读全文
摘要:关于help:python中 help(raw_input)结果如下:Help on built-in function raw_input in module __builtin__:raw_input(...) raw_input([prompt]) -> string Read a string from standard input. The trailing newline is stripped. If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError. O...
阅读全文
摘要:最近遇到vmware好多问题,比如无法从windows下copy到虚拟机内,还有启动的时候出现各种问题,包括startx进不了X windows,一直没找到问题,今天重新装了vmware tools之后,所有问题迎刃而解。
阅读全文
摘要:今天收到盛大的面试,问我一个问题,关于派生类中如何初始化基类对象,我在想派生类对于构造函数不都是先构造基类对象,然后在构造子类对象,但是如果我们在成员初始化列表先初始化派生类的私有成员,在函数内去调用基类的构造函数,能编译通过吗?或者当我们定义了基类的默认构造函数,而没有去在派生类的构造函数中显示的去调用基类的构造函数,会出现什么状况,我想派生类肯定会自动去调用基类的默认构造函数,那么析构函数又怎么样呢?我们都知道派生类的析构函数会先被调用,然后基类的析构函数后被调用,但是我不知道我们是否需要在派生类的析构函数中显示的去调用基类的析构函数吗?这个有待我去验证。代码一:在派生类中成员初始化列表先
阅读全文
摘要:第一天:闭包和高阶函数,闭包相当于一个class,闭包是一个函数,函数内部有一些局部变量和内部函数的定义,闭包接受的参数可以是一般的变量也可以是函数变量,输出也可以是一般的变量和函数变量,高阶函数呢,高级函数至少满足两个条件中的一个,首先是接受一个或多个函数作为输入,其次是输出一个函数。泛函是一种定义域是函数,值域是实数的函数。也就是说输入参数是函数,输出是实数的函数。Currying(柯里化),是把接受接受多个参数的函数转化为接受一个参数的函数。并返回接受余下参数而且返回结果是新函数。原来接受两个参数的加法函数,def add(x,y): return x+yCurrying:def ad.
阅读全文
摘要:最近每天都在学习技术,现在我有一些自己的想法,以前总是想什么都学,突然发现什么都学,结果就是什么都学不好,如果只在一段时间内研究一个东西,但是东西不要太大,比如我最近在研究内存的东西,我只看程序内存这一块的东西,我发现我能学到很多的东西,现在我准备开始入手函数式编程,时间定了三个星期,哈哈希望能在这三个星期内学习到很多的东西。
阅读全文
摘要:刚刚在洗澡的时候在想函数式编程的东西,函数式编程不是将函数看成一个对象,函数就是变量,它可以作为参数使用,它既可以作为左值来使用也可以作为右值来使用,函数式编程任何一个函数对于同一个输入,既在函数参数列表中的输入,不会产生多余两种不同的结果,为什么呢?因为函数式编程内部所有的变量不受外部的影响,也就是说,没有其他方法来改变我的内部状态,我的内部状态只有局部变量,没有全局变量,反正就是没有与其他函数共享的变量,所以函数式编程就像数据从函数的入口进入,从函数的出口出去,经过函数加工后,再流入其他的函数。函数式编程的思想在于递归,但是以前我一直没有理解,为什么是递归,我洗澡时候想了想,应该是因为,如
阅读全文
摘要:对于C/C++程序员来说,指针是天堂,同时指针也是地狱。指针有多少好处,又有多少让人头疼的问题我们这里就不多说了。但为了局部解决指针的问题,我们提出了智能指针这个概念。实际上,我一直不明白,智能指针用于干什么!直到我遇到有关栈和堆问题的时候,才依稀有了点感悟,我现在的感悟几乎肯定是不全面的,但是很重要。几乎有关指针的问题的出现集中在指针指向堆上空间的时候,为什么呢?如果指针指向的是栈上的空间,我们知道这里的空间是有系统自动管理的,申明释放都是由系统根据栈的策略来进行的。我们能够干预的部分很少。而对于指向堆空间的指针,由于申请(new),和释放(free)必须要程序员显示的进行调用,并且该空间的
阅读全文
摘要:以前写过一篇关于智能指针的文章,但是还是没有搞清楚两个东西:1。智能指针如何调用被智能指针指向的对象的成员函数,我不知道如何只通过智能指针去访问指向对象的成员方法,请看我的写的智能指针的demo。#include <iostream>using namespace std; class A{private: int n;public: A(int m):n(m) {} ~A(){ cout<<"~A() is called\n"; } int get() const{ cout<<"get() is called\n"
阅读全文
摘要:昨天晚上在看智能指针的时候,我发现自己连一个拷贝构造函数和赋值构造函数都写不出来,自己就尝试写了一个版本,结果发现错误百出,对于拷贝构造函数和赋值构造函数的理解仅仅停留在理论的方面,而不知其中太多的内涵。比如我们都知道拷贝构造函数和赋值构造函数最大的不同在于:拷贝构造是确确实实构造一个新的对象,并给新对象的私有成员赋上参数对象的私有成员的值,新构造的对象和参数对象地址是不一样的,所以如果该类中有一个私有成员是指向堆中某一块内存,如果仅仅对该私有成员进行浅拷贝,那么会出现多个指针指向堆中同一块内存,这是会出现问题,如果那块内存被释放了,就会出现其他指针指向一块被释放的内存,出现未定义的值的问题,
阅读全文
摘要:X Window System Version 7.1.1Release Date: 12 May 2006X Protocol Version 11, Revision 0, Release 7.1.1Build Operating System: Linux 2.6.18-53.el5 x86_64 Red Hat, Inc.Current Operating System: Linux ST-Server 2.6.18-274.7.1.el5 #1 SMP Thu Oct 20 16:21:01 EDT 2011 x86_64Build Date: 22 February 2012Bui
阅读全文
摘要:#include <iostream>using namespace std;template <class T>class smartpointer{private: T *_ptr;public: smartpointer(T *p) : _ptr(p) //构造函数 { } T& operator *() //重载*操作符 { return *_ptr; } T* operator ->() //重载->操作符 { return _ptr; } ~smartpoint...
阅读全文
摘要:计算机就是数学的一个分支,不管你认不认同,你都会发现在编程的过程中,你能够发现很多的数学思维的闪现,就比如递归,递归可以让程序简化,与非递归比较,简单的递归函数省去了大段大段的代码,让人叹服不已,递归往往能体现设计者头脑的聪慧,但是递归的思想与数学又有什么相关呢?本文将介绍递归与数学归纳法之间的联系,希望给读者一些启迪。要说递归得先说,数学归纳法,想必每一个程序员在高中的时候就应该学习了数学归纳法,当我们需要去证明一个证明题时,很可能就要用到数学归纳法,数学归纳法的思想如下:一般地,证明一个与自然数n有关的命题P(n),有如下步骤:(1)证明当n取第一个值n0时命题成立。n0对于一般数列取值为
阅读全文
摘要:归并排序和快速排序都将树的思想放进了排序当中,你可以发现快速排序有点类似二叉树的前序遍历,而归并排序有点类似树的后序遍历,但是你可以发现,快速排序有可能产生的是一棵非平衡的二叉树,而归并必然产生一棵平衡的二叉树,所以归并排序的不会产生最坏的情况
阅读全文
摘要:今天受到百度的电话面试问题:如何从1000万个数中取出随机的不重复的1万个数问题:关于python我还没有说,关于函数式编程的东西我觉得python中给我印象最深刻的是没有变量不与类型绑定,变量当前可能是整形,但是下一把就是列表
阅读全文
摘要:最近我发现360竟然做搜索了,我也尝试用了一下360的搜索,发现还是可以的,对于一些技术上的搜索,360还是挺给力的,360现在又和google合作,我感觉百度得有危机感了,虽然现在在搜索上仍旧是百度独大,但是假如中国有1亿人在用360的杀毒软件和安全卫士的话,那么至少有一半以下的人在用360的浏览器,360的浏览器必然将360的搜索放在搜索的首位,如果360在搜索上的技术和百度如果是一样好的,或者仅仅比百度差一点的话,那么必然造成百度的人员流失,这个很要命,关键现在google和360的合作,说不定google对360会有技术上的帮助,这个将对百度产生致命的打击。以前我们笑看3Q大战,我觉得
阅读全文
摘要:最近在学习C++,C++有用new和不用new来创建对象,但是两者是有区别的,用new的话,那就要程序员自己去分配和释放内存,因为对象存储在堆中,而不用new呢,对象存储在栈中,栈中的内存是由系统来管理的,不用程序员去释放,那么可以利用这一点,来达到一个目的,就是利用栈中对象随过程的消失而自动调用对象的析构函数释放对象,智能指针就是利用这个特新,如果我们将所有的动态分配的资源放在对象中,那么我们不就可以不用去关心内存是否真的释放了,不用去手动delete,这样就可以解决内存泄漏的问题。下面是写的智能指针的简化版: 1 #include <iostream> 2 3 using na
阅读全文
摘要:什么是lambda函数,中文名叫匿名函数?在你需要的时候采才去定义它,函数形式如下:lambda 参数列表 : 表达式lambda x,y:x*ylambda x: x*2但是这个不行 lambda x: x=x+2 不行,因为不是表达式函数式编程的思想,把所有的函数就当做对象一样看待,而lambda函数也一样,g = lambda x: x*2此时g就相当于函数def g(x): return x*2 那么lambda函数在那可以使用呢?如下一些小函数不需要重用,如果只用一次,而且这个函数可以用一个表达式来表示,那么就可以用lambda函数,当然你也可以不这么干。分割与合并字符串:join.
阅读全文
摘要:我们都知道频繁的动态内存分配很可能会造成大量的内存碎片和效率低下,因为需要搜索整个空闲链表找到可以被分配的内存块,而且容易造成内存泄漏等问题,那么如何解决这两个问题呢?内存池技术带你走进这个问题的殿堂。内存池技术首先会分配一大块内存给程序,当程序需要分配内存的时候从内存池中去获得,而且不需要去释放内存,当内存池不在用的时候释放整个内存即可,只分配,不释放,大大减少了时间。优势:1·效率快,无需调用malloc或者new,系统调用慢,而且搜索空闲块也慢2·不会产生过多的内存碎片,3·可以避免内存泄漏nginx=NXnginx的内存池设计非常巧妙得利用了HTTP短连接
阅读全文
摘要:list加入新的变量:l.append(n)尾部加l.insert(2,n)在l[2]插入ntriple和list有什么区别:riple是静态的,不可更改,并有自动去重功能数据中有10000个数,其中某个数重复率打到50%以上,求快速找出这数的方法答案:10000个数分成两两一组,然后比较不相同去掉,相同的留下,如果一次不能得到结果,再做一次,最终会得到结果
阅读全文
摘要:#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>void* func1(void *p){ int i = 5; printf("address of func1:i is %p\n",&i); sleep(4); printf("%d\n",*((int *)((unsigned int)(&i) - 1024 * 10244)));}void* func2(void *p){ int
阅读全文
摘要:哈希函数就是根据输入的键值对,将键相同的键值对放入同一个桶中,但是有可能不同的键也放入到相同的桶中,那么办,桶中桶,通过二次哈希,进一步将不同的键值对放入不同的桶中,或者通过拉链法,拉出一条链来,将这个桶中的所有键值对都入链,不管任何一种方法,在第一次哈希的时候,必须能保证所有的键值对能均匀的分布在不同的桶内,这个才是关键。所有的map任务和reduce任务都是运行在分布式文件系统上,因为文件很大,所有文件被分成很多块,而如何划分呢?当然是通过hash函数,将大的文件划分为不同的文件块,每一个文件块是一个键值对,map任务的输入就是由这些文件块组成,并且键相同的文件块在同一个map任务上处理,
阅读全文
摘要:On program startup, the integer file descriptors associated with the streams stdin, stdout, and stderr are 0, 1, and 2, respectively. The preprocessor symbols STDIN_FILENO, STDOUT_FILENO, and STDERR_FILENO are defined with these values in <unistd.h>. (Applying freopen(3) to one of these stream
阅读全文
摘要:每个进程都有自己的虚拟地址空间,我们知道除了堆中的虚拟内存我们可以由程序员灵活分配和释放,其他的区域的虚拟内存都有系统控制,那么还有没有其他方法让程序员去灵活控制虚拟内存呢?linux下的mmap函数就此而来,mmap函数可以为我们在进程的虚拟空间开辟一块新的虚拟内存,你可以将一个文件映射到这块新的虚拟内存,所以操作新的虚拟内存就是操作这个文件,下面我将介绍mmap函数的运用。首先介绍mmap函数的头文件以及函数声明:#include <sys/mman.h>void *mmap(void* start, size_t length, int prot, int flags, in
阅读全文
摘要:云的出现,正在改变我们对于传统IT的观念认识。云并不像它的概念一样虚无缥缈,而是以各种形式出现在我们面前,而最让人耳熟能详的莫过于云存储和云计算。云存储的出现改变了一些人的存储方式和习惯,而云计算又将给我们带来什么?在这个云的时代,服务器又将走向何处呢?云计算来了目前,中国有望成为全球云计算产业增长最快的新兴市场,包括IBM、微软、Cisco、Citrix、VMware、Salesforce、Oracle/SUN、DELL、HP、EMC、NetApp、华为、中兴、施耐德等一大指国际厂商和包括中软、浪潮、八百客、阿里云、全时、263在内的一大批云计算厂商/服务商将在中国市场展开竞争。未来三到五年
阅读全文
摘要:http://blog.sina.com.cn/s/blog_6444798b0100pslu.htmlhttp://www.liaoqiqi.com/blog/2010/discussion-about-the-memory-allocation-using-heap-stack-static-area/http://my.oschina.net/solu/blog/2537http://hi.baidu.com/gungod/item/65853f1ae8c9b316e3f98648下面两种动态内存管理的方法:堆内存分配和mmap的内存分配,此两种分配方法都是通过相应的Linux 系统调用
阅读全文
摘要:以应聘外企为例,下面总结归纳了应聘外企面试时一般会提的10个问题,同时附上我们认为比较好的回答,或者说是我们希望你能这样来回答比较好,希望对大家有所帮助:1、请介绍一下你自己。这是外企常问的问题。一般人回答这个问题过于平常,只说姓名、年龄、爱好、工作经验,这些在简历上都有,其实,外企最希望知道的是求职者能否胜任工 作,包括:最强的技能、最深入研究的知识领域、个性中最积极的部分、做过的最成功的事,主要的成就等,这些都可以和学习无关,也可以和学习有关,但要突出 积极的个性和做事的能力,说得合情合理外企才会相信。外企很重视一个人的礼貌,求职者要尊重考官,在回答每个问题之后都说一句“谢谢”。外企喜欢有
阅读全文
摘要:为什么不要再代码里频繁的new和delete了呢,因为new是在堆中搜索一块可用的内存给程序使用,在堆中分配的内存不是连续的,不像栈,后进先出,你不可能在栈的中间pop出一块内存,所以想要使用栈中某一块内存,你必须先释放这块内存中上面的内存,也就是出栈,但是堆不一样,堆的分配的内存不连续,所以当你在程序中new了很多次,而你的程序还没有及时delete这些内存,那么就会造成最后有内存,你却new不出,因为不够大,无法满足的你需要的大小,这个就是内存碎片的问题,那么如何解决内存碎片呢?以后再探讨,可能自己需要写一个内存分配算法,还有内存池的方法,等等。。。。我觉得最好改变动态分配内存不连续的问题
阅读全文
摘要:我们都知道C++中有三种创建对象的方法,如下:#include <iostream>using namespace std;class A{private: int n;public: A(int m):n(m) { } ~A(){}};int main(){ A a(1); //栈中分配 A b = A(1); //栈中分配 A* c = new A(1); //堆中分配 delete c; return 0;}第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存,而第三种使用了new,...
阅读全文
摘要:一段漂亮的代码必须考虑到内存泄漏的问题,而内存泄漏根本原因是因为你的程序在heap中分配的内存没有释放掉,当然没有释放掉的原因很多,最简单的就是你new完之后没有写delete,当然还有很多其他的原因,下面是我最近的一些新得。 #include <iostream>using namespace std;#define true 1class A{private: int n;public: A(int m){ cout<<"A() is called\n";} ~A(){ cout<<"~A() is called\n&quo
阅读全文
摘要:Check if your commits haveChange-Id: ...in their descriptions. Every commit should have them.you can "git log" to review your commits haveChange-IdIf no, usegit rebase -ito reword the commit messages and add proper Change-Ids (usually this is a SHA1 of the first version of the reviewed com
阅读全文
摘要:A:区别主要是:string的内存管理是由系统处理,除非系统内存池用完,不然不会出现这种内存问题。char *的内存管理由用户自己处理,很容易出现内存不足的问题。当我们要存一个串,但是不知道其他需要多少内存时, 用string来处理就最好不过了。当你知道了存储的内存的时候,可以用char *,但是不如用string的好,用指针总会有隐患。用string还可以使用各种成员函数来处理串的每一个字符,方便处理。用char *处理串,就不如string的方便了,没有相应的函数来直接调用,而是要自己编写函数来完成串的处理,而且处理过程中用指针还很容易出现内存问题。我建议尽量使用string,不用char
阅读全文
摘要:好久没写过c程序,都忘记了c程序中的字符串的含义。今天问过而知新,c语言字符串其实就是一个字符数组,比如char* ptr = "hello world",其实就是ptr[] = {'h','e','l','l','0',' ','w','o','r','l','d','\0'}; 声明一个字符串会自动在末尾添加一个\0 不需要人工干预。总结如下: 一个字符串必须要一个 \0 结尾 不
阅读全文
摘要:由于利用管道实现进程间通信,是通过创建两个文件描述符,但是描述符的初始化是通过随机的,就是从可用的文件描述符中取出,并将可用的文件描述符与file对象相关联,如果我们需要将管道的两头与其他的流相关时,就需要重定向操作,重定向fd[0]和fd[1]的file,下面是关于实现重定向的函数dup和dup2的解释:系统调用dup和dup2能够复制文件描述符。dup返回新的文件文件描述符(没有用的文件描述符最小的编号)。dup2可以让用户指定返回的文件描述符的值,如果需要,则首先接近newfd的值,他通常用来重新打开或者重定向一个文件描述符。他的原型如下:#include <unsitd.h>
阅读全文
摘要:最近在想一个问题,关于进程间通信的问题,我们都知道进程间可以通过管道通信,但是为什么进程间可以通过管道通信呢?管道通信的机制又是什么呢?我想很多人应该没有去思考过,下面我来讲讲我对管道通信机制的理解。如果两个不相关的进程打开同一个文件,一个只读方式开打,一个只写方式打开,不就相当于创建了一个管道了,进程A往里面写,进程B读,同样实现进程间通信。管道其实也一样。一般的管道,只能在父子进程间进行通信,为什么?因为管道实现的进程间通信是在父进程fork()出子进程时,子进程会继承父进程的文件描述符表,而这个文件描述符表里记录了所有父进程打开的文件,所以子进程也继承了父进程打开的文件,所以父子进程可以
阅读全文
摘要:最近在看深入理解计算机系统,看到一个函数叫做execve(),这个函数很有意思,可以在一个进程插入另外一个进程执行,但是又不像fork()一样产生一个子进程,execve()插入的进程和原进程共享进程号,就好像执行这进程就像执行过程调用一般随意。函数原型如下:int execve(const char *filename, char *const argv[], char *const envp[]);EXAMPLE The following program is designed to be execed by the second program below. It jus...
阅读全文
摘要:我们知道进程有自己的虚拟地址空间,并且互不干扰,那么进程间通信又如何实现呢?A又看不到B的地址,B又看不到A的地址,那A怎么访问B的东西,B又怎么访问A的东西,我想这应该得借助第三方的东西,我们都知道进程地址空间有一段内核地址,里面是进程由用户态进入内核态时进程运行的内核态环境,比如通过系统调用进入内核态获取内核服务,进程的内核态也有自己内核栈,为什么需要内核栈呢?用户栈难道不就够了吗?因为内核服务很多都是受保护的,比如访问页表,进程控制块这些东西。但是内核栈又和进程间通信有什么相关呢?对于OS所有的进程间通信都是调用系统调用实现的,所有的系统调用都要陷入到内核态去执行。问题:管道是如何实现进
阅读全文
摘要:一个lex程序具有如下形式:声明部分:包括变量和明示常量,可以将一些c语言的东西写在%{....... %},并且可以在转换规则中调用%{ #include <stdio.h> int id_num; /*常量量*/%}letter [A-Za-z] /*正则变量*/start start /*正则变量*/stop stop /*正则变量*/转换规则:通过在声明部分的正则变量,识别输入流中的单词,并可以执行一些动作lex程序中的每个转换规则具有如下形式: 模式 {动作}%%letter {id_...
阅读全文
摘要:最近在学习编译原理,发现以前在数据结构中学习到的KMP算法在词法分析中使用到,词法分析中要识别词法单元,构建符号表,并将识别的词法单元返回给语法分析器来处理。在这个过程中有一个状态转化的过程,如下:如要识别ababaa,状态转换图如下所示:KMP提出了一种在文本串中搜索单个关键字b1b2....bn的算法,为了快速处理文本串并在这些串中搜索一个关键字,针对关键字b1b2....bn以及该关键字中的位置s(s表示关键字b1b2....bn中的状态转换图中的状态)定义了一个失效函数f(s),f(s)的含义如下:f(s)表示匹配到状态s,但是匹配不到状态s+1,下一次从状态f(s)开始匹配。比如文本
阅读全文
摘要:求一个数组中第k大的数,我第一印象是冒泡,因为只要冒泡k趟即可,第一趟冒泡第一大,第二次冒泡第二大,第k次冒泡第k大,时间复杂度为O(kn),n为数组长度。但是我们都知道快速排序是对冒泡的改进,降低冒泡的递归深度,使时间复杂度降低到O(nlgn),为什么不用快排呢?那么快排的时间复杂度又是多少呢?因为快排每次将数组划分为两组加一个枢纽元素,每一趟划分你只需要将k与枢纽元素的下标进行比较,如果比枢纽元素下标大就从右边的子数组中找,如果比枢纽元素下标小从左边的子数组中找,如果一样则就是枢纽元素,找到,如果需要从左边或者右边的子数组中再查找的话,只需要递归一边查找即可,无需像快排一样两边都需要递归,
阅读全文
摘要:对于冒泡排序,大家肯定都熟知,每一轮的冒泡都将最大的数排到最前面,每一轮的时间复杂度是O(n),如果要排序的数组大小为n,要经过n轮才能将数组中所有元素排序,所以总共的时间复杂度为O(n2)。关于冒泡排序的源码如下:迭代型冒泡排序#include <stdio.h>#define length(array) sizeof(array)/sizeof(array[0])#define true 1#define false 0void BubbleSort(int *a, int len) //待排数组a以及它的长度len{ int ordered = false; int temp
阅读全文