2006-06-29 23:32
在一个长时间运行的系统中(如一个httpserver),内存的分配和释放操作很频繁.
如果只是按照平常的编程模式,
在需要内存时在堆中分配,在使用完后立即释放, 效率会很低.
因为在c++中,系统默认的new和delete操作为了兼顾所有的情况,效率很低,同时,反复的内存分配和释放,肯定会导致“内存空洞”的产生,而导致整个程序的运行性能的下降。所以,有必要事先分配若干内存,在使用时直接使用,而不用现分配,这样程序的效率会大大提高。
这里我写出了一个简单内存池的实现方案。虽然比较小,但还是比较实用而且效率也比较高。为了实现兼容性,我以模板的方式来实现。
首先我先谈谈内存池的管理策略。管理内存池,我选择的方式是以数组的方式来管理。因为的数组的随机访问的时间度为O(1),访问效率非常的高。也有用链表的方式来实现内存管理的,这样灵活性比较高,但效率比较低,所以我觉得用数组的方式比较好。
下面谈谈实现的细节。假设我们为某个对象A建立一个指针数组 A*
P[100](这里为了简单起见,以一个静态数组来描述),然后为数组中的元素分配空间:
  |
2006-06-29 23:28
this 可以直接访问一个隐藏的指针,这个指针就称为 this
指针。它实际上是类定义中一个缺省的预定义的指针。当调用一个成员函数时,系统保证this
指针始终指向产生这个调用的对象,并将该指针作为一个变元自动传递给该函数。同时,只有对象和成员函数之间才存在
this 指针。
【示例】下面一段程序创建一个叫做power的类来计算一个数的幂:
power
{
private:
double b,
val;
int e;
public:
power(double
base, int exp);
double
get_power() { return val;}
};
power::power(double base int exp)
{
b = base;
e = exp;
val = 1;
if(exp == 0)
|
2006-06-22 12:56
Unicode给每个字符提供了一个唯一的数字,
不论是什么平台,
不论是什么程序,
不论是什么语言。
基本上,计算机只是处理数字。它们指定一个数字,来储存字母或其他字符。在创造Unicode之前,有数百种指定这些数字的编码系统。没有一个编码可以包含足够的字符:例如,单单欧州共同体就需要好几种不同的编码来包括所有的语言。即使是单一种语言,例如英语,也没有哪一个编码可以适用于所有的字母,标点符号,和常用的技术符号。
这些编码系统也会互相冲突。也就是说,两种编码可能使用相同的数字代表两个不同的字符,或使用不同的数字代表相同的字符。任何一台特定的计算机(特别是服务器)都需要支持许多不同的编码,但是,不论什么时候数据通过不同的编码或平台之间,那些数据总会有损坏的危险。
Unicode正在改变所有这一切!
Unicode给每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论什么语言。Unicode标准已经被这些工业界的领导们所采用,例如:Apple,
HP, IBM, JustSystem, Microsoft, O |
2006-06-22 12:29
原题要求用c++做的,不过用模拟精灵比较快,但未仔细分析优化。
第一题 连续正整数(10分)
题目描述:一个正整数有可能可以被表示为n(n>
=2)个连续正整数之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
输入数据:一个正整数,以命令行参数的形式提供给程序。
输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最小正整数开始、以从小到大的顺序打印。如果结果有多个序列,按各序列的最小正整数的大小从小到大打印各序列。此外,序列不允许重复,序列内的整数用一个空格分隔。如果没有符合要求的序列,输出“NONE”。
例如,对于15,其输出结果是:
1 2 3 4 5
4 5 6
7 8
|
2006-06-15 02:14
4.2.3 程序实现与上机实习(二)
一、实验目的
编写圆和椭圆的扫描转换算法程序,验证算法的正确性。
二、实验任务
1. 编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动;
2. 添加鼠标程序,实现交互式画圆;
3. 编写中点画椭圆法的扫描转换程序;
4. 添加鼠标程序,实现交互式画椭圆;
三、实验内容
1.编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动;
分析:考虑圆心不再原点,设圆心坐标为(x0,y0)。通过平移坐标原点到圆心,则第二个8分圆上一点p(x,y),其原始坐标为
x’=x+x0
y’=y+y0
即p’1(x0 +x, y+y0)
其 |
2006-06-06 18:13
/********************************************************************
* 文件名: micosoft.h
* 文件描述: 解微软面试题
* 创建人: 陈泽丹, 2006年3月28日, (QQ:82314038)
* 版本号: 2.0
* 修改记录:
********************************************************************/
/*====================================================================
问题描述:
5个海盗抢到了100颗宝石,每一颗都一样大小且价值连城。他们决定这么分:
1抽签决定自己的号码(1~5);
2首先,由1号提出分配方案,然后大家表决,当且仅当超过半数的人同意时,按
照他的方案进行分配,否则将被扔进大海喂鲨鱼;
3如果1号死后,再由2号提出分配方案,然后进行表决,当且仅当超
过半数的人同意时,按照他的方案进行分配,否则将被扔入大海喂鲨鱼;
5依此类推……
条件:每个海盗都是很聪明的人,都能很理智 |
2006-06-05 19:08
摘自csdn
已知strcpy函数的原型是:
char * strcpy(char * strDest,const char * strSrc);
1.不调用库函数,实现strcpy函数。
2.解释为什么要返回char *。
解说:
1.strcpy的实现代码
char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strSrc==NULL)) //[1]
throw "Invalid argument(s)"; / /[2]
char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy;
}
错误的做法: |
2006-06-05 19:01
根据《出现频率最高的笔试题》cphj(原作),及众多的网友的观点。本人做了以下总结:
大多数人都同意以下这个写法:只是个人风格有些不同而已。
char
*strcpy(char* dest, const char* src)
{
assert(NULL != dest);
assert(NULL != src);
char *tmp = dest;
while('\0' != (*tmp++=*srC++))
//因为*tmp不是布尔值所以有必要比较
;
return(dest);
}
而根据MS中的定义如下:
(% |
2006-06-02 10:14
C++引用与指针的比较
引用是C++中的概念,初学者容易把引用和指针混淆一起。
一下程序中,n是m的一个引用(reference),m是被引用物(referent)。
int m;
int &n = m;
n相当于m的别名(绰号),对n的任何操作就是对m的操作。
所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。
引用的规则:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
以下示例程序中,k被初始化为i的引用。
语句k = j并不能将k修改成为j的引用,只是把k的值改变成为6。
由于k是i的引用,所以i的值也变成了6。
int i = 5;
int j = 6; |
2006-05-19 14:52
#ifndef, c++, cpp
常常在建立header
file的时候需要先写一段文字
比如下面这段话
#ifdef
HEADERFILENAME_H
#define HEADERFILENAME_H
class ClassName
{
...
};
#endif
那段#ifdef有必要写吗?
其实有些无写都不会影响代码的Runtime
不过对运行速度和文件大小有一定的影响
大概很多人很喜欢用#include来抓取文件吧
炎也很喜欢
总是在main.cpp中include一次
然后又在classfile.cpp中又使用一次
每次都include同样 |
2006-05-19 14:45
笔者从事UNIX环境下某应用软件的开发与维护工作,用户分布于全国各地,各用户需要的基本功能都是一样的,但在某些功能上要随着需求变化,不断加以升级,要想实现全国各地用户的升级工作是很困难的,而我们则只是利用E-mail发送补丁程序给用户,这些补丁程序都是在一套软件的基础上不断地修改与扩充而编写的,并由不同的标志文件转入到不同的模块,虽然程序体积在不断扩大,但丝毫不影响老用户的功能,这主要是得益于C程序的#ifdef/#else/#endif的作用。
我们主要使用以下几种方法,假设我们已在程序首部定义#ifdef
DEBUG与#ifdef TEST:
1.利用#ifdef/#endif将某程序功能模块包括进去,以向某用户提供该功能。
在程序首部定义#ifdef HNLD:
#ifdef HNLD
#include"n166_hn.c"
#endif
如果不许向别的用户提供该功能 |
2006-05-19 14:18
下面关于C++的几个关键字是经常和我们打交道的而我们又经常对这些含糊不清的,本文根据自己的学习体会作以总结,以期达到真正理解和活用的目的。
static
l
|
2006-05-10 14:22
国内现在有百胜P-3500、同洲2000B升级版和高斯贝尔5000等数字接收机具有DiSEqC功能,那么什么是DiSEqC呢?请看
DiSEqC标准介绍——DiSEqC英文为Digital Satellite Equipment Control,直译为“数字卫星设备控制”,有1.0、1.1、1.2、2.0等不同版本的标准,是用数字卫星电视接收机控制,发出指令集(控制指令)给相应设备,如切换开关、切换器、天线驱动设备、LNB等。
工作过程是数字卫星电视接收机内部在同步时钟脉冲配合下,通过与LNB高频头相连的同轴电缆线,经调制于22KHz频率上交替变化的数字信号串行转送相关控制指令。
DiSEqC1.0常用于控制多入一出的中频切换器的控制;
DiSEqC1.1是1.0的扩充版本;
DiSEqC1.2则加入驱动并控制推动杆或极轴座的功能;
DiSEqC2.0就具有双向控制的功能,外设就会有信息传回数字卫星电视接收机。
|
2006-05-10 12:34
首先,有必要向大家讲一讲,什么是API。所谓API本来是为C和C++程序员写的。API说来说去,就是一种函数,他们包含在一个附加名为DLL的动态连接库文件中。用标准的定义来讲,API就是Windows的32位应用程序编程接口,是一系列很复杂的函数,消息和结构,它使编程人员可以用不同类型的编程语言编制出的运行在Windows95和Windows NT操作系统上的应用程序。可以说,如果你曾经学过VC,那么API对你来说不是什么问题。但是如果你没有学过VC,或者你对Windows95的结构体系不熟悉,那么可以说,学习API将是一件很辛苦的事情。 如果你打开WINDOWS的SYSTEM文件夹,你可以发现其中有很多附加名为DLL的文件。一个DLL中包含的API函数并不只是一个,数十个,甚至是数百个。我们能都掌握它嘛?回答是否定的∶不可能掌握。但实际上,我们真的没必要都掌握,只要重点掌握Windos系统本身自带的API函数就可以了。但,在其中还应当抛开掉同VB本身自有的函数重复的函数。如,VB 的etAttr命令可以获得文件属性,SetAttr可以设置文件属性。对API来讲也有对应的函数 GetFileAttributes和SetFileAttributes, |
2005-12-30 01:28
|
|