浮萍晓生的开发日志

记录学习的旅程,把握可预见的未来

导航

文章分类 -  基础知识

1

摘要:在GNU C中,宏可以接受可变数目的参数,就象函数一样,例如:?12#define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt, ##arg)用可变参数宏(variadic macros)传递可变参数表你可能很熟悉在函数中使用可变参数表,如:?1voidprintf(constchar* format, ...);直到最近,可变参数表还是只能应用在真正的函数中,不能使用在宏中。C99编译器标准终于改变了这种局面,它允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏。可变参数宏就像下面这个样子:?1# 阅读全文

posted @ 2014-04-12 09:28 浮萍晓生 阅读(131) 评论(0) 推荐(0)

摘要:new、delete(new[]、delete[])操作符的重载需要注意:1、重载的 new、delete(或者 new[]、delete[])操作符必须是类的静态成员函数(为什么必须是静态成员函数,这很好理解,因为 new 操作符被调用的时候,对象还未构建)或者是全局函数,函数的原型如下:void* operator new(size_t size) throw(std::bad_alloc);// 这里的 size 为分配的内存的总大小void* operator new[](size_t size) throw(std::bad_alloc); void operator delete( 阅读全文

posted @ 2014-03-20 16:17 浮萍晓生 阅读(313) 评论(0) 推荐(0)

摘要:虽然C++标准库已经为我们提供了new与delete操作符的标准实现,但是由于缺乏对具体对象的具体分析,系统默认提供的分配器在时间和空间两方面都存在着一些问题:分配器速度较慢,而且在分配小型对象时空间浪费比较严重,特别是在一些对效率或内存有较大限制的特殊应用中。比如说在嵌入式的系统中,由于内存限制,频繁地进行不定大小的内存动态分配很可能会引起严重问题,甚至出现堆破碎的风险;再比如在游戏设计中,效率绝对是一个必须要考虑的问题,而标准new与delete操作符的实现却存在着天生的效率缺陷。此时,我们可以求助于new与delete操作符的重载,它们给程序带来更灵活的内存分配控制。除了改善效率,重载n 阅读全文

posted @ 2014-03-20 15:59 浮萍晓生 阅读(210) 评论(0) 推荐(0)

摘要:#include #include using namespace std;/* 重载new应返回void*类型,如果内存分配请求成功,就返回指向内存的指针; * 如果失败,则遵循规定抛出一个std::bad_alloc类型的异常 * 重载operator new需要注意的一些问题,参见: * http://blog.csdn.net/xushiweizh/archive/2006/11/19/1395783.aspx * 重载delete以void*为参数, *//* 重载了全局的new操作符 */void* operator new (unsigned int size){ cout... 阅读全文

posted @ 2014-03-20 15:30 浮萍晓生 阅读(183) 评论(0) 推荐(0)

摘要:C++ 中的枚举类型继承于 C 语言。就像其他从 C 语言继承过来的很多特性一样,C++ 枚举也有缺点,这其中最显著的莫过于作用域问题——在枚举类型中定义的常量,属于定义枚举的作用域,而不属于这个枚举类型。例如下面的示例:enum FileAccess { Read = 0x1, Write = 0x2,};FileAccess access = ::Read; // 正确FileAccess access = FileAccess::Read; // 错误C++枚举的这个特点对于习惯面向对象和作用域概念的人来说是不可接受的。首先,FileAccess::Read 显然更加符合程序员的直觉,因 阅读全文

posted @ 2014-03-20 10:36 浮萍晓生 阅读(83) 评论(0) 推荐(0)

摘要:String hexResult = ""; byte[] bs = myResult.getBytes(); char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); int bit = 0; for (int i = 0; i > 4; sb.append(digital[bit]); bit = bs[i] & 0x0f; sb.append(digital[bit]); } hexResul 阅读全文

posted @ 2014-03-20 10:35 浮萍晓生 阅读(96) 评论(0) 推荐(0)

摘要:在C语言的应用领域,如通讯领域和嵌入式系统领域,一个的软件项目通常包含很多复杂的功能,实现这个项目不 是一个程序员单枪匹马可以胜任的,往往需要一个团队的有效合作,另外,在一个以C代码为主的完整的项目中,经常也需要加入一些其他语言的代码,例如,C代 码和汇编代码的混合使用,C文件和C++的同时使用。这些都增加了一个软件项目的复杂程度,为了提高软件质量,合理组织的各种代码和文件是非常重要的。 组织代码和文件的目的是为了使团队合作更加有效,使软件项目有良好的可扩展性、可维护性、可移植性、可裁减、可测试性,防止错误发生,提高软件的稳定性。 通常情况下,软件项目采用层次化结构和模块化开发的方法,例... 阅读全文

posted @ 2014-03-20 10:22 浮萍晓生 阅读(156) 评论(0) 推荐(0)

摘要:环形缓冲区是嵌入式系统中十分重要的一种数据结构,比如在一个视频处理的机制中,环形缓冲区就可以理解为数据码流的通道,每一个通道都对应着一个环形缓冲区,这样数据在读取和写入的时候都可以在这个缓冲区里循环进行,程序员可以根据自己需要的数据大小来决定自己使用的缓冲区大小。 环形缓冲区,顾名思义这个缓冲区是环形的,那么何谓环形这个意思也很好理解,就是用一个指针去访问该缓冲区的最后一个内存位置的的后一位置时回到环形缓冲区的起点。类似一个环一样。这样形容就很好理解了,当然有办法实现了。我在这里采用了2种方式实现了环形缓冲区,一个是用数组的方法,一个是用链表的方法。 数组是一块连续的内存,所以顺序访问... 阅读全文

posted @ 2014-03-20 10:06 浮萍晓生 阅读(810) 评论(0) 推荐(0)

摘要:静态编译:将所有的dll和主程序都编译到一个主程序里面。动态编译:编译的结果为,主程序是主程序,各个模块是各个模块。其中静态编译和动态编译是可以设置工程属性动态设置的!静态链接:静态链接已经把函数的定位信息写入到可执行文件内部了。静态连接就是把需要的库函数放进你的exe之中。所以静态编译必然通过静态链接来实现。动态链接:动态链接就是要动态的链接,运行时候动态的链接dll。所以动态编译必然通过动态链接来实现。静态库:静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。所 以要静态加载的程序,也就是静态库,是lib后缀名的文件(在windows系统中)。你可以在VS2005中ne 阅读全文

posted @ 2014-03-20 09:44 浮萍晓生 阅读(352) 评论(0) 推荐(0)

摘要:【memset性能陷进】memset是大家常用的函数,而且一般的编程书籍都会谆谆告诫大家:申请内存后要初始化,防止使用未经初始化的内存导致不可预知的结果,所以我们一般都会按照如下方式编写代码:char* buffer = (char*)malloc(1024);memset(buffer, 0x00, 1024);代码看起来很标准,也很美观,但这里却隐藏着一个陷进:memset的性能并不高!如果你的内存在1K左右,可能还察觉不到,但如果是1M,那性能影响就很明显了,我们来看实测数据(Redhat EL5 Intel(R) Xeon(R) CPU E5620 2.40GHz, gcc 4.1.2 阅读全文

posted @ 2014-03-19 16:20 浮萍晓生 阅读(397) 评论(0) 推荐(0)

摘要:void VS_StrLTrim(char *value) { char *temp = value; while (*temp==0x20 || *temp==0x0A || *temp==0x0D) { ++temp; } while(*temp != 0x00) { *value = *temp; ++value; ++temp; } *value = 0x00;}void VS_StrRTrim(char *value) { char *te... 阅读全文

posted @ 2014-03-17 14:38 浮萍晓生 阅读(140) 评论(0) 推荐(0)

摘要:问题1:讲一个十进制数字的字符串表示转换成对应的整数。举例:将“1234”转换成整数1234./*将字符串s转换成相应的整数*/int atoi(char s[]){ int i; int n = 0; for (i = 0; s[i] >= '0' && s[i] = 'A' && c = '0' && s[i] = 'a' && s[i] ='A' && s[i] '9') { n = 16 * n + (10 阅读全文

posted @ 2014-03-04 11:34 浮萍晓生 阅读(232) 评论(0) 推荐(0)

摘要:一、main结束 不代表整个进程结束 (1)全局对象的构造函数会在main 函数之前执行, 全局对象的析构函数会在main函数之后执行; 用atexit注册的函数也会在main之后执行。 (2)一些全局变量、对象和静态变量、对象的空间分配和赋初值就是在执行main函数之前,而main函数执行完后,还要去执行一些诸如释放空间、释放资源使用权等操作 (3)进程启动后,要执行一些初始化代码(如设置环境变量等),然后跳转到main执行。全局对象的构造也在main之前。二、main()之后执行的代码,用atexit注册的函数也会在main之后执行#include void fn1(void){ ... 阅读全文

posted @ 2014-02-27 16:30 浮萍晓生 阅读(223) 评论(0) 推荐(0)

摘要:1、为何空类的大小不是0呢?为了确保两个不同对象的地址不同,必须如此。类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址。同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了。所以,空类的sizeof为1,而不是0.2、请看下面的类:class A{ virtual void f(){} };class B:public A{}此时,类A和类B都不是空类,其sizeof都是4,因为它们都具有虚函数表的地址。3、请看:class A{};class B:public virtual A{};此时,A是空类,其大小为1;B不是空类,其 阅读全文

posted @ 2014-02-24 11:15 浮萍晓生 阅读(1594) 评论(0) 推荐(0)

摘要:HTTP的定义和历史 在一个网络中。传输数据需要面临三个问题: 1.客户端如何知道所求内容的位置? 2.当客户端知道所求内容的位置后,如何获取所求内容? 3.所求内容以何种形式组织以便被客户端所识别? 对于WEB来说,回答上面三种问题分别采用三种不同的技术,分别为:统一资源定位符(URIs),超文本传输协议(HTTP)和超文本标记语言(HTML)。对于大多数WEB开发人员来说URI和HTML都是非常的熟悉。而HTTP协议在很多WEB技术中都被封装的过多使得HTTP反而最不被熟悉。 HTTP作为一种传输协议,也是像HTML一样随着时间不断演进的,目前流行的HTTP1.1是HTTP协议的第三个版本 阅读全文

posted @ 2014-02-15 10:20 浮萍晓生 阅读(128) 评论(0) 推荐(0)

摘要:一:http的由来:OSI模型把网络通信分成七层:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,对于开发网络应用人员来说,一般把网络分成五层,这样比较容易理解。这五层为:物理层、数据链路层、网络层、传输层和应用层(最顶层),下面是一张网络分层的图片(来源于网络):网络中的计算机互相通信就是实现了层与层之间的通信,要实现层与层之间的通信,则各层都要遵守规则,这样才能完成更好的通信, 我们就把它们之间遵守的规则就叫个“协议”,然而网络上的五层之间遵守的协议不一样,每层都有各自的协议。下面就由下至上的讲述每层的协议物理层:物理层是五层模型中的最底层,物理层为计算机之间的数据通信提供了传 阅读全文

posted @ 2014-02-14 18:11 浮萍晓生 阅读(239) 评论(0) 推荐(0)

摘要:引言HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。HTTP协议的主要特点可概括如下:1.支持客户/服务器模式。2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因 阅读全文

posted @ 2014-02-13 17:38 浮萍晓生 阅读(103) 评论(0) 推荐(0)

摘要:一、文件的复制#include #include using namespace std;int CopyFile(char *SourceFile,char *NewFile){ifstream in;ofstream out;in.open(SourceFile,ios::binary);//打开源文件if(in.fail())//打开源文件失败{ cout>source;cout>NewFile;if(CopyFile(source,NewFile)){ cout#include #include void main(){char source[256];//文件路径cout 阅读全文

posted @ 2014-02-13 16:06 浮萍晓生 阅读(362) 评论(0) 推荐(0)

摘要:什么是HTTP协议协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器目前我们使用的是HTTP/1.1 版本Web服务器,浏览器,代理服务器当我们打开浏览器,在地址栏中输入URL,然后我们就看到了网页。 原理是怎样的呢?实际上我们输入URL后,我们的浏览器给Web服务器发送了一个Request, Web服务器接到Request后进行处理,生成相应的Response,然后发送给浏览器, 浏览器解析Response中的HTML,这样我们就看到了网页,过程如下图所示 阅读全文

posted @ 2013-12-31 14:12 浮萍晓生 阅读(128) 评论(0) 推荐(0)

摘要:共有两种库:一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。共有两种链接方式:动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。关于lib和dll的区别如下:(1)lib是编译时用到的,dll 阅读全文

posted @ 2013-12-06 10:28 浮萍晓生 阅读(81) 评论(0) 推荐(0)

1