life02

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  197 随笔 :: 3 文章 :: 37 评论 :: 0 Trackbacks

#

[此帖已被设为精华] 转载

发信站: 北邮人论坛 (Tue Oct 20 16:52:13 2009), 站内

     先简单介绍一下本人,本人小硕,信通院通信与信息系统,无线方向,投的百度无线新技术研发,技术岗。虽然在实验室做过一些项目,但也都是无线通信的底层开发,和互联网没有任何关系。。。
   今早尚未睡醒,突然一阵手机铃声传来,一个陌生的手机号码,见其不是响一声电话,遂接之,在不算清楚的状态下被通知下午一点普天大厦百度面试,突如其来的通知搞的我有点措手不及。本来觉得18号笔试完直接被鄙视了,这从天而降的机会还是迫使我需要在短时间内做好必要的准备,所谓的准备也就是从网上查查面经,复习复习笔试题目,总之还是抱着学习的态度去的,没抱太大希望。
   下午12点40到达普天大厦,签到后稍微等了一会儿,接待我的jj将我指到一个小型的广场,阳光很好,有很多小圆桌,我的面试官已经坐在其中一个小圆桌上等我了,是一对一的面试,坐下后简单打了个招呼,面试就开始了,先是按照我的简历问我关于最近一个项目的相关内容,包括项目组的职责,做过什么,贡献在哪,碰到过什么难题等等,因为面试官gg估计也不太懂我做过的东西,我就blabla一顿介绍,然后又问我学的课程中认为哪个比较困难,困难在哪,有没有具体例子,总之问的比较细。我觉得在这个环节最重要的就是让面试官觉得项目是你做的,有的可讲,对于自己的贡献的部分讲的越细越好,对方听没听懂没有关系,关键在于能够有条理的回答对方问的问题(当然,如果对方对自己做过的项目非常了解,回答问题的时候就应该尽量谨慎,不要扯淡,以免露怯。。。)
   之后的环节是算法,数据结构,编程题,由面试官现场出题,他先出了两个比较简单的题目,一个是 char str ="hello";sizeof(str)和strlen(str)为多少,还有一个是floata;将其和0做比较的if语句如何编写。然后出了一个数据结构算法实现题:给定二叉树,写出计算该二叉树的高度的函数,这题我没想出来。。。他又出了一个:给定二叉树,写出拷贝该二叉树的函数,返回拷贝后根节点值,这道题我只说出了大概的思路,看面试官的表情,不是很满意。。。随后又问了关于二叉树深度优先和广度优先的算法问题,和堆排序的算法问题,无奈专业背景相差过大,这些我都没答上来,对于学计算机的学生,我觉得这些问题应该都不难。。。最后又给我出了道关于字符串的问题:给定字符串,内容为a-z的字符,其中有一个字符出现为奇数次,其他均为偶数次,找出出现奇数次的字符,我简单给出了一个算法,但是时间复杂度过高,于是面试官gg问我能不能对算法进行优化,这个又难住我了,虽然面试官gg人很好,在我想的过程中一直给予提示,无奈我水平不够。。。想出来的答案都相去甚远。。。我觉得这个环节本身考察的问题其实并不难,都是基础,换一个学计算机的学生,这些东西不过是平时的功课罢了,只要算法,数据结构的基础知识过硬,回答这些问题应该都不会很困难
   距离面试结束还有几分钟的时候,和面试官gg简单聊了聊,获知对方是南开计算机毕业的,告诉我互联网行业技术岗主要要求的素质包括算法和数据结构,网络的基本知识,编程能力等等,期间还说了一些我没太明白的专有名词,总之,他觉得以我现在的知识储备和项目经历,目前还不太适合这个职位。。。
    一个小时后,面试结束,本来我也是抱着学习的心态过来试试,对于这样的结果我还是预想的到的,这一趟面试也算没有白来,能够学到一些东西我就知足了。希望大家都能找到好工作,共勉!
转载请注明出自应届生求职招聘论坛 http://bbs.yingjiesheng.com/,本贴地址:http://bbs.yingjiesheng.com/thread-253544-1-1.html

 

 

posted @ 2009-10-23 14:56 life02 阅读(371) | 评论 (0)编辑 收藏

1 计算 a^b << 2 (运算符优先级问题)
int a = 2;
int b = 1;
int c = 2;
cout << (a ^ b << c);
6
2 根据先序中序求后序

3 a[3][4]哪个不能表示 a[1][1]: *(&a[0][0]) *(*(a+1)+1) *(&a[1]+1) *(&a[0][0]+4)
cout << *(&a[1][1]) << endl
       <<*(*(a+1)+1) << endl
       << *(&a[1]+1) << endl
       << *(&a[0][0]+4);
6
6
0012FEC8
5
4 for(int i...)
    for(int j...)
      printf(i,j);
      printf(j)
会出现什么问题
J没有定义,不在其作用域
5 for(i=0;i<10;++i,sum+=i);的运行结果
    int i, sum = 0;
for(i=0;i<10;++i,sum+=i);
cout << sum;
55
6 10个数顺序插入查找二叉树,元素62的比较次数

7 10个数放入模10hash链表,最大长度是多少

8 fun((exp1,exp2),(exp3,exp4,exp5))有几个实参
2个,逗号运算符,
9 希尔 冒泡 快速 插入 哪个平均速度最快

10 二分查找是 顺序存储 链存储 按value有序中的哪些

11 顺序查找的平均时间

12 *p=NULL *p=new char[100] sizeof(p)各为多少
都是4
13 频繁的插入删除操作使用什么结构比较合适,链表还是数组
链表
14 enum的声明方式
enum A{
a1,
a2,
a3,
};
15 1-20的两个数把和告诉A,积告诉B,A说不知道是多少,
B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数是多少


大题:

1 把字符串转换为小写,不成功返回NULL,成功返回新串

char* toLower(char* sSrcStr)
{
    char* sDest= NULL;
    if( __1___)
    {
        int j;
        sLen = strlen(sSrcStr);
        sDest = new [_______2_____];
        if(*sDest == NULL)
            return NULL;
        sDest[sLen] = '\0';
        while(_____3____)
           sDest[sLen] = toLowerChar(sSrcStr[sLen]);
    }
    return sDest;
}
char toLowerChar(char a)
{
    if(a >= 'A' && a <= 'Z')
       return a - 'A' + 'a';
}

char* toLower(char* sSrcStr)
{
    char* sDest= NULL;
    if(sSrcStr)
    {
       int j;
       int sLen = strlen(sSrcStr);
       sDest = new char[sLen + 1];
       if(*sDest == NULL)
           return NULL;
       sDest[sLen] = '\0';
       while(sLen--)
           sDest[sLen] = toLowerChar(sSrcStr[sLen]);
    }
    return sDest;
}

2 把字符串转换为整数 例如:"-123" -> -123

main()
{
    .....
    if( *string == '-' )
        n = ____1______; -1* num(string+1)
    else
        n = num(string);
    .....
}

int num(char* string)
{
    for(;!(*string==0);string++)
    {
        int k;
        k = __2_____; *string
        j = --sLen;
        while( __3__) j--
            k = k * 10;
        num = num + k;
    }
    return num;
}

附加题:

1 linux下调试core的命令,察看堆栈状态命令

2 写出socks套接字 服务端 客户端 通讯程序

3 填空补全程序,按照我的理解是添入:win32调入dll的函数名
查找函数入口的函数名 找到函数的调用形式
把formView加到singledoc的声明 将singledoc加到app的声明

4 有关系 s(sno,sname) c(cno,cname) sc(sno,cno,grade)
1 问上课程 "db"的学生no
2 成绩最高的学生号
3 每科大于90分的人数

2005年腾讯招聘
选择题(60)
c/c++ os linux 方面的基础知识 c的Sizeof函数有好几个!
程序填空(40)
1.(20) 4空x5
不使用额外空间,将 A,B两链表的元素交叉归并
2.(20) 4空x5
MFC 将树序列化 转存在数组或 链表中!

发信人: ChinaOfey (勇敢的傻,傻得勇敢), 信区: Career_Plaza
标 题: 腾讯笔试题
发信站: 水木社区 (Sat Nov 5 16:25:25 2005), 站内

希望明年的兄弟有用!(B卷)

第一部分:基本都是数据结构题+1,2道操作系统和数据库相关的(比较基本)

有印象的:

1,为节省空间,两个栈共用一个空间,栈底在两边,问什么时候表明空间用完
    答案:栈顶相遇时
    这道题就是很基础的一个题目,因为是第一道题,所以印象比较深^_^

2,char A[5]; char* B ="abcdefg"; void * C; C = new char[100];
    sizeof(A) sizeof(B) size(C)
5,4,4
3,爸爸,妈妈,妹妹,小强,至少两个人同一生肖的概率是多少
    1- 12*11*10*9/12*12*12*12 = 43% ,我忘用1减了....

然后还有几个看程序给结果的题,考察了类,指针的内容

第二部分:程序填空

   主要要能看出他的思路

第三部分:写代码

   1,关于mfc的,一个控件,显示时间,1s钟刷新一次

   2,SQL语言进行简单的数据库操作,建表,查询,求平均工资等

     不记得语言了,因此只好自创....ft

   3,Unix进程通信有哪些方式,各有什么特点?

   (其中A卷给的是道网络编程题目)

第四部分:主观题

考rp的,比较无聊,手都写酸了....

程序4说明]
设 M 叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根结点的值部分
(设为一个字符) 和用“( )”,括起来的各子树的列表 (如有子树的话) ,各子列表间用“
,”,分隔。例如下面的三叉树可用列表 a( b( c,d ),e,f( g,h,i ))表示。
 

本程序输入列表,生成一棵 M 叉树,并由 M 叉树输出列表。假定输入无错误。
[程序4]
#include〈stdio.h〉
#include〈stdlib.h〉
#define M 3
typedef struct node{ char val;
struct node *subTree[M];
} NODE;
char buf[255] ,*str = buf
NODE *d = NULL
NODE *mackTree( ) /*由列表生成M叉树*/
{ int k; NODE *s ;
s = __(1)__
s -> val = *str++ ;
for ( k = 0 ; k < M ; k++ ) s-> subTree[k] = NULL ;
if(*str='( '){
k = 0;
do { str++;
s -> subTree[k] = __(2)__ ;
if ( *str == ')' ) { str++; break ; }
k = k+l ;
} while ( __(3)__ );
}
return s ;
}
void walkTree( NODE *t ) /*由 M 叉树输出列表*/
{ int i ;
if( t != NULL ) {
__(4)__
if ( t -> subTree[0] == NULL ) return ;
putchar ( '( ' ) ;
for ( i = 0 ; i < m ; i++) {
__(5)__
if ( i! = M - l && t -> subTree[i+l] != NULL )
putchar ( ', ' ) ;
}
putchar ( ') ' ) ;
}
}
 
void main( )
{ printf( "Enter exp:" ) ;
scanf( "%S" , str ) ;
d = makeTree() ;
walkTree( d ) ; putchar( '\n') ;
}
有两个集合  
集合A{1,7,19,21,55,100。。。}  
集合B{7,22,100。。。}  
两个集合都是10万个数据(已排序),要求写一个算法,判断B是不是A的子集,算法时间复杂度为Q(N)
posted @ 2009-10-19 21:59 life02 阅读(372) | 评论 (1)编辑 收藏

今天上午在南大,做了阿里巴巴的技术题,我两份都做了,下面把其中C++相关的题回忆了一部分起来,希望对大家有帮助啊,
为了给大家省点钱,我就直接粘贴在页面上啦,描述不全的,大家谅解啊

1.Stuct Foo{
Foo(){}
Foo(int){}
Void fun(){}
};

int main (){
Foo a(10);
(1)
a.fun();
(2)
Foo b();
(3)
b.fun();
(4)
}
上面的程序中哪个语句是错误的;

2.struct 和 class 的区别;

3.const char*p1=”hello”;

Char *const p2=”world”;
下面哪些操作是合法的:(1)p1++;
(2)*p1=”w”;
(3)p2++;
(4)*p2=”h”;

4.n进制下。567*456=150216成立,则n的值是多少?

5.C++中不能重载的运算符是?

6.排序方法中元素比较次数与初始化排序无关的是哪种排序方法。

7. int x[4]={0}; int y[4]={1};则x,y的值是多少?

8.二分查找的理论

9.采取FIFO页面淘汰算法,如何计算缺页。

10.顺序栈的容量如何计算

11.文件索引结构

12.搜索所用的数据结构的内存,以及速度的问题

13.堆中的数据的存储机制

14.页式存储系统,如何计算分块的大小

15.std::vector::iterator
可重载的运算符是哪些: ++,>>, *(前置), ==

16.判断单向链表是否存在环的最佳方案是什么?

17.100张多米诺骨牌1,2,3 ……100,第一次先把所有的基数位置的牌拿掉,第二次把剩下的基数位置的牌拿掉,依此类推,最后剩下的牌是哪个:(A)32,(B)64,(C)88,(D)96

18.在C++中不能重载下面的哪个运算符:(A)*
(B) ?:
(C) ::
(D) delete

19.就是指针的一大堆问题啦,什么函数指针啊,数组指针之类的

20. sizeof() 计算问题

21. public,protected在派生或者继承之后的访问权的问题
转载请注明出自应届生求职招聘论坛 http://bbs.yingjiesheng.com/,本贴地址:http://bbs.yingjiesheng.com/thread-239002-1-1.html

 

 

posted @ 2009-10-18 21:28 life02 阅读(1706) | 评论 (1)编辑 收藏

作者:baihacker
来源:http://hi.baidu.com/feixue http://hi.csdn.net/baihacker

问题描述:
12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
这个笔试题,很YD,因为把某个递归关系隐藏得很深.

问题分析:
我们先把这12个人从低到高排列,然后,选择6个人排在第一排,那么剩下的6个肯定是在第二排.
用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有6个0,6个1的序列,就对应一种方案.
比如000000111111就对应着
第一排:0 1 2 3 4 5
第二排:6 7 8 9 10 11
010101010101就对应着
第一排:0 2 4 6 8 10
第二排:1 3 5 7 9 11
问题转换为,这样的满足条件的01序列有多少个.
观察1的出现,我们考虑这一个出现能不能放在第二排,显然,在这个1之前出现的那些0,1对应的人
要么是在这个1左边,要么是在这个1前面.而肯定要有一个0的,在这个1前面,统计在这个1之前的0和1的个数.
也就是要求,0的个数大于1的个数.
OK,问题已经解决.
如果把0看成入栈操作,1看成出栈操作,就是说给定6个元素,合法的入栈出栈序列有多少个.
这就是catalan数,这里只是用于栈,等价地描述还有,二叉树的枚举,多边形分成三角形的个数,圆括弧插入公式中的
方法数,其通项是c(2n, n)/(n+1).

在 < <计算机程序设计艺术>>,第三版,Donald E.Knuth著,苏运霖译,第一卷,508页,给出了证明:
问题大意是用S表示入栈,X表示出栈,那么合法的序列有多少个(S的个数为n)
显然有c(2n, n)个含S,X各n个的序列,剩下的是计算不允许的序列数(它包含正确个数的S和X,但是违背其它条件).
在任何不允许的序列中,定出使得X的个数超过S的个数的第一个X的位置.然后在导致并包括这个X的部分序列中,以
S代替所有的X并以X代表所有的S.结果是一个有(n+1)个S和(n-1)个X的序列.反过来,对一垢一种类型的每个序列,我们都能
逆转这个过程,而且找出导致它的前一种类型的不允许序列.例如XXSXSSSXXSSS必然来自SSXSXXXXXSSS.这个对应说明,不允许
的序列的个数是c(2n, n-1),因此an = c(2n, n) - c(2n, n-1).[Comptes Rendus Acad.Sci.105(Paris, 1887), 436~437]

验证:
其中F表示前排,B表示后排,在枚举出前排的人之后,对应的就是后排的人了,然后再验证是不是满足后面的比前面对应的人高的要求.
C/C++ code
#include <iostream> using namespace std; int bit_cnt(int n) { int result = 0; for (; n; n &= n-1, ++result); return result; } int main() { int F[6], B[6]; int ans = 0; for (int state = 0; state < (1 << 12); ++state) if (bit_cnt(state) == 6) { int i = 0, j = 0; for (int k = 0; k < 12; ++k) if (state&(1<<k)) F[i++] = k; else B[j++] = k; int ok = 1; for (int k = 0; k < 6; ++k) if (B[k] < F[k]) {ok = 0; break;} ans += ok; } cout << ans << endl; return 0; }
结果:132
而c(12, 6)/7 = 12*11*10*9*8*7/(7*6*5*4*3*2) = 132
注意:c(2n, n)/(n+1) = c(2n, n) - c(2n, n-1)

估计出题的人也读过 < <计算机程序艺术>>吧.

PS:
另一个很YD的问题:
有编号为1到n(n可以很大,不妨在这里假定可以达到10亿)的若干个格子,从左到右排列.
在某些格子中有一个棋子,不妨设第xi格有棋子(1 <=i <=k, 1 <=k <=n)
每次一个人可以把一个棋子往左移若干步,
但是不能跨越其它棋子,也要保证每个格子至多只有一个棋子.
两个人轮流移动,移动不了的为输,问先手是不是有必胜策略.
posted @ 2009-10-17 22:18 life02 阅读(382) | 评论 (1)编辑 收藏

1. 匹配"[10]:dddddd"和"[9]:abcdegf"但不匹配"[a]:xfdf"的正则表达式。

2. int a[5]={1,2,3,4,5};

    printf("%d\n", *((int*)(&a+1)-2);

    输出是什么。

    答:4.    分析:(int*)(&a+1)=a+5=&a[5]

编程题:

1. 给定一个int型数组array[n],写一个函数sort(int array[], int n),n为数组长度。使得数组中不大于零的元素在前,大于零的元素在后,要求时间复杂度O(n)。

2. 有1001个球。甲乙两人交替取球,每次可取1、2、4个球,谁拿到最后一个球就算输。如果甲先拿,问他有没有必胜的把握?为什么?

   答:有。

          第一次甲拿1个球,以后每次:

          i. 乙拿1个,甲拿2个;

         ii. 乙拿2个,甲拿1个或4个;

         iii. 乙拿4个,甲拿2个。

         最后肯定剩一个,并轮到乙拿。

3. 实现atoi()和itoa()

4. 给定一个int型数n,写一个尽可能简单的函数判断n是否为2的幂,不能用循环。

   答:bool foo(int n)

          {

                int a=n;

               if(n<=0) return false;

               a=((a&0xAAAAAAAA)>>1)+(a&0x55555555);

               a=((a&0xCCCCCCCC)>>2)+(a&0x33333333);

               a=((a&0xF0F0F0F0)>>4)+(a&0x0F0F0F0F);

               a=((a&0xFF00FF00)>>8)+(a&0x00FF00FF);

               a=((a&0xFFFF0000)>>16)+(a&0x0000FFFF);

               if(a==1) return true;

               else return false;

           }

简答题:

1. 哪些方法可以避免或减少锁的使用?

2. release版本的可执行程序为什么非常大?

3. 使用C++赋值运算符应注意什么地方?

4. strcpy()为什么会造成缓冲区溢出?可用哪个函数替代?

5. 阻塞模式的recv在没受到数据的情况下如何返回?(不能将socket修改为非阻塞)

8. 有红、绿、蓝三色球分别3,2,1个。取任意两个不同颜色的球都会使它们变成第三种颜色的两个球。问最少取多少次,可使这些球都变成同一种颜色?

   答:无论多少次,都不可以使这些球变成同一种颜色,分析:

         一、对于(R,R,R,G,G,B)即(3,2,1),有:

                i.   (R,G) ---> (B,B,B,R,R,G)即(3,2,1)

                ii. (R,B)   ---> (G,G,G,G,R,R)即(4,2)

                iii. (G,B) ---> (R,R,R,R,R,G)即(5,1)

          二、对于(G,G,G,G,R,R)即(4,2),有 :

                i. (R,G) ---> (G,G,G,B,B,R)即(3,2,1)

          三、对于(R,R,R,R,R,G)即(5,1)有 :

                i. (R,G) ---> (R,R,R,R,B,B)即(4,2)

          因此,只有三种状态(3,2,1), (4,2)和(5,1),不可能出现(6,0)这种情况。   

9. 哪些方法可让一个进程仅有一个实例运行?

10. exit()和_exit() 的区别。

11. 红黑树比AVL树的优势在哪?

12. 软件开发过程包含哪些阶段?各阶段质量保证措施是什么?

posted @ 2009-10-15 11:59 life02 阅读(1858) | 评论 (4)编辑 收藏

网易2007Hust游戏开发工程师笔试

1.拼七巧板,还是比较有意思的(10分)

2.判断下列图案中哪一个与其他三个不同。(10)

 


       A                           B                            C                          D

3.有一个队列长一百米,有一个人从尾走到头,再从头走到尾,期间他的速度和队列的速度都不变,队列正好行进了100米,问这个人走了多少距离。(10)

 

4.推理题。关于白帽、黑帽的,可以网上搜搜类似的。(10)

 

5.一个文章系统,用户登陆后输出欢迎信息:(20)

1.用户注册时间不足一个月,输出信息A:欢迎新用户,您还没有发表文章,可以先熟悉一下系统,查看帮助信息。

2.用户注册时间不足一个月,输出信息B:欢迎新用户,您已经发表了文章,不过在最初一个月发表3篇或3篇以上文章会对以后很有帮助。

3.用户注册时间小于三个月,输出信息C:用户您好,在最初一个月后您没有发表文章,请多多努力。

4.用户注册大于三个月,输出信息D:用户您好,最近3个月您都未发表文章,如果长时间不发表文章,您的帐号将被冻结。

5.其他情况输出E:欢迎您的登陆。

 

1)画出流程图

2)写出实现代码,不需要定义变量类型

 

相关函数

GetRegisterTime(username)
 获得用户username的注册时间
 
GetNowTime()
 获得现在时间
 
TimeDiff(time1,time2)
 获得time1到time2的天数
 
AddDay(time1,day_num)
 在time1上加上天数,可以为负,得到新时间
 
GetArticleCount(username,time1,time2)
 获得用户在time1和time2之间发表的文章数量
 
Print(A)
 输出信息A,可以将A换成B、C等等
 

如有其他函数请自己定义并说明用途。

6.计算概率,具体不记得了。(10)

7.英文题目Next Number。(20)

大意就是要根据输入数字,输出一个新数,要求输出数字各个位的和加起来与原数相等。输出的数字是大于原数的第一个数。

 

如Input:113,output:122,Input 0050,output: 0104。

输入的N位数字k(0<=k<=101000,0<=N<2000)。

设计完成函数,用伪码实现。

 

游戏研发工程师必做题

1.一个游戏,角色属性有:生命、攻击、速度、防御、魔法,试设计一个角色的数据结构,用代码实现。

2.若该游戏发布了资料篇,资料篇中角色属性添加了两个:魔防、敏捷。现改进原设计,怎么区分老版游戏和资料篇玩家,并正确读取。

3.在网络游戏中GM通常有一定特权可以对角色属性进行修改,现有GM1,可以对角色的攻击属性修改,而不能对其他属性修改,试设计系统(所有属性都是可读的)。GM的指令通常为以下模式://moveto x,y;移动到x,y;//kick 用户,踢出某一用户。

 

2.最优打怪路线

玩家从东往西进行,打怪只能打南北的怪,消耗的能量与怪物离玩家的距离有关,试找出一个最好的打怪路线。

注:玩家只能水平移动,怪物均是静止的,不移动。

 

1)证明该路线是最佳路线

2)代码实现

 

3.用户支付

1)某一网络游戏用户分为3种类型:计时用户、包月用户、合作用户,合作用户是与别的厂家合作,可能在某一段时间免费或计费与别的不同,试设计一个支付系统,支付部分代码实现。

2)后来又添加了一种用户:道具收费用户,即玩家游戏时间免费,而是通过购买游戏中道具需要钱,4种用户运行于同一台服务器,试改进系统。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qiluofei/archive/2007/10/20/1834263.aspx

posted @ 2009-10-15 10:42 life02 阅读(2884) | 评论 (0)编辑 收藏

09.3.27更新  
     

        与玩游戏相比,写游戏要复杂上千万倍,除了需要掌握通用的编程技巧以外,还要有相当的图形学,物理,数学基础,特别是在国内,由于相关资料的缺乏,更是让初学者无从下手。下面总结了一些入门方法和比较容易入手的资料。


         首先你要精通一门高级语言,比如C++或者C#,其次,要有良好的英文阅读能力。对游戏开发者来说英文阅读能力是最重要也是最基本的工具之一,因为你遇到的大部分资源都将是英文的,不要总等着别人为你翻译。慢慢尝试着阅读英文资料,你会发现其实也并没有那么难:)


         刚开始,你要做的就是选择一门图形API,一般就是DirectX或者OpenGL之间选一个。如果考虑到跨平台,那么OGL是首选. 如果只在ms的平台,则DX是首选。我对OGL并不是很了解,所以下面大部门资料都是和DX相关的。

         当然,作为准备工作之一,你首先要到DirectX Develop Center下载最新版的DirectX SDK。


         入门书籍非常重要,推荐<<Introduction to 3D Game Programming with DirectX 9.0>>(好像去年出了中文版)也就是传说中的龙书,这可以说是最好的DX入门教材,Frank Luna从浅入深,讨论了DX的方方面面。另外再配上<< Advanced 3D Game Programming With DirectX 9.0>>,书名虽然是advanced,但实际上没有多少advanced级别的内容。看完这两本书,你基本上已经对DirectX比较熟悉了。如果你希望学习XNA,也是一样的,毕竟XNA是以DX为基础。


         不要一开始就看图形学的书,这个时候你对图形编程还没有一个基本的感性认识,因此八成看的云里雾里。不要以网上的教程和论坛提问作为主要学习途径,找一本好书,系统学习,效率才最高。不要马上看SDK里的例子,很多图形学的基本原理仅仅通过读代码是不会明白的。某些年代太过久远的书就不要看了,比如《windows游戏编程大师技巧》(总看到有人在找这本书)。有人说基本的思想总是不变的,可惜对于现代GPU来说,很多早期的技术和优化技巧早就过时了。图形编程是发展的非常快的技术,看看GPU的发展速度,1~2年就是一代产品的革新。


          好了,入门之后,是你巩固和拓展视野的阶段。现在看计算机图形学就比较合适了。吐血推荐<<Real-Time-Rendering>>,这本书算得上是所有图形程序员的必读书籍和参考手册了。最近刚出了第三版(更新:已经有电子版了)。可惜国内只有第二版,稍微有点老,如果实在找不到第三版,还是值得一读。国内其他所有以图形学命名的书都有一个共同点:枯燥,过时。只需看看其中二维三维变换和曲线曲面表示的部分即可。如果这个时候发现你当年数学没有学好,那么有三本数学书是为游戏程序员量身定制的:<<3D Math Primer for Graphics and Game Development>>, <<Mathematics for 3D Game Programming and Computer Graphics>>和<<Essential Mathematics Guide 2nd Edition>>,第一本书有中文版,最后一本则是08年才出的新书。


         其实入门之后,就没有固定的学习路线了,最好根据你感兴趣的方向来学习。


Shader方面:《Cg_tutorial》和《The Complete Effect and HLSL Guide》都是不错的入门材料,当然还有SDK文档。<<Shaders for Game Programmers and Artists>>有大量入门的例子。<<Advanced Lighting And Materials With Shaders>>详细介绍了各种光照模型和技术。<<GPU Gems>> 1~3册肯定是必读的,虽然有1,2有中文版,但某些翻译并不是很理想,强烈建议直接看英文版。ShaderX系列也是很经典的系列,每年出版一本,包含了最新的实时渲染技术,如今已经出了第6册了。不过网络上只能找到1~3册。1,2册大部分shader都是用asm写的,不过看懂原理,转换为HLSL也并不难。另外Nvidia SDK和ATI SDK也是学习shader的重要资源。最后还有刚出的<< Programming Vertex, Geometry, and Pixel Shaders>>


地形:<<Real Time 3D Terrain Engines Using C++ And DX9>>非常全面的讨论了关于地形渲染的各种技术,至少应该把第5~9章都浏览一遍。之后便可以 到virtual terrain查阅近期的地形渲染技术。


模型导入和动画:<<Advanced Animation with DirectX>>,仅此一本足以。


物理:<<Game Physics>>和<<Game Physics Engine Development>>都不错。<<Real-time Collision Detection>>是碰撞检测方面最好的书,可惜目前还没有电子版。


LOD:<<Level of Detail for 3D Graphics>>


Ray tracing:<< Physical-Based Rendering - From Theory to Implementation>>


引擎设计:说实话,这方面还没有特别好的书,大概越是核心的内容,越少有人愿意写吧。<<3D Game Engine Architecture Engineering Real-Time Applications with Wild Magic>>只有第三章值得一读。<<3D Game Engine Programming>>可以选部分感兴趣的章节看看,不过总的来说,讲的比较浅。更新:<<3D Game Engine Design, Second Edition>>出了影印版本,强烈推荐。最近发现<<Pro OGRE 3D Programming>>也很不错,200多页短小精干,但是可以让读者快速了解一个既有引擎的设计和构架。


AI:<<Programming Game AI by Example>>非常不错,好像还有中文版,备选<<Artificial Intelligence for Games>>。当然<<AI Programming Wisdom>>系列也是必读作品,不过目前网络上只有1~2册。

网络:%##@%...(本人是网络白痴 +_+........)


综合:<<Game Programming Gems>>系列,不过由于内容涉及的过于广泛,文章质量参差不齐,选择性阅读就可以了。历年GDC, Gamefest t,Siggraph等大型会议的paper也是应该关注的。

         至于那些“All in one”或者n天较你写出个FPS游戏的书就不要读了,这类书的通病是什么都说了,结果什么也没说清楚。


         除了书以外,再推荐一些不错的网络资源:

www.GameDev.net 除了大量教程以外,论坛里多年累计下来的内容保罗万象。好好利用论坛搜索,你会发不管你多厉害,那里总有一些比你强大的人在很久以前就遇到了和你同样的问题,并且给出了解决方案。

Nvidia和ATI的开发者中心

creators.xna.com XNA官方网站

www.gamasutra.com 与GameDev类似

www.beyond3d.com 这里的除了讨论软件以外,还能看到对硬件构架的分析

www.ziggyware.com 最好的XNA教程网站

www.gameres.com 国内唯一比较专业的游戏编程网站,可惜和GameDev相比就显得太寒碜了-_-#

         当然,不要忘了收集各大论坛里牛人们的blog:)

         最后,仅仅靠看书是不够的,多写多练才是王道。

ps:以上书籍,除了特别注明的以外,都是可以通过网络或者书店入手的。
pps:不要找我要电子书,我能找到的,相信你也能找到,你找不到的,我肯定也没有 :)

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/soilwork/archive/2009/01/08/3731645.aspx

posted @ 2009-10-10 21:37 life02 阅读(222) | 评论 (0)编辑 收藏

1、Java

Java编程语言(第三版)---Java四大名著----James Gosling(Java之父)

Java编程思想(第2版)----Java四大名著----Bruce Eckel

Java编程思想(第3版)----Java四大名著----------------Bruce Eckel

JAVA 2核心技术 卷I:基础知识(原书第7版)---Java四大名著-----Cay Horstmann

JAVA 2核心技术 卷II:高级特性(原书第7版)----Java四大名著-----Cay Horstmann

Effective Java中文版------Java四大名著--------Joshua Bloch

精通Struts:基于MVC的Java Web设计与开发---孙卫琴

精通Hibernate:Java对象持久化技术详解---孙卫琴

Tomcat与Java Web开发技术详解------------孙卫琴

Java与模式------------------------------阎宏


2、c#

C#程序设计-------Charles Petzold“windows编程泰山北斗”---C#语言“倚天屠龙双剑”

C# Primer中文版--------Stanley B.Lippman---C#语言“倚天屠龙双剑”

.NET框架程序设计(修订版)--------Jeffrey Richter“windows编程泰山北斗”---.NET平台四大天王

c#Windows程序设计----------Charles Petzold“windows编程泰山北斗”------.NET平台四大天王

.NET程序设计技术内幕-------------Jeff Prosise---.NET平台四大天王

.NET本质论--第1卷:公共语言运行库(中文版)--------Chris Sells---.NET平台四大天王

 

3、C++

C++程序设计语言(特别版)---c++八大金刚----Bjarne Stroustrup“C++之父”

C++ Primer (第3版)中文版----c++八大金刚---Stanley B.Lippman

C++ Primer (第4版)中文版----c++八大金刚---Stanley B.Lippman

C++标准程序库—自修教程与参考手册--c++八大金刚--Nicolai M.Josuttis

C++语言的设计和演化-----c++八大金刚----Bjarne Stroustrup“C++之父”

深度探索C++对象模型---c++八大金刚----Stanley B.Lippman

Essential C++中文版---c++八大金刚---Stanley B.Lippman

Effective C++中文版 2nd Edition-----c++八大金刚------Scott Meyers

More Effective C++中文版----c++八大金刚------Scott Meyers

C++编程思想(第2版) 第1卷:标准C++导引--------Bruce Eckel

C++编程思想(第2版)第2卷:实用编程技术 --------Bruce Eckel

C++程序设计--------------------------谭浩强

C++ 程序设计教程(第2版)--------------钱能

C++ Primer Plus(第五版)中文版---Stephen Prata

广博如四库全书The c++ programming language、c++ Primer
深奥如山重水复Inside the c++ object model
程序库大全The c++ standard libray
工程经验之积累Effective c++、More Effective c++、Exceptional c++

 

c++八大金刚:
1、Essentital c++---lippman---C++之父,旁枝暂略,主攻核心,轻薄短小,初学者

2、The c++ programming language----C++之父,技术权威,用词深峻,思想深远,c++百科全书代表

3、c++ Primer----lippman---纵横书市十数年,c++最佳教本,c++百科全书代表。
4、Inside the c++ object model-----lippman----揭示c++底层,非常好,非常难。
5、Effective c++-----通过50个编程实例,展示专家经验,行文有趣,深处浅出。
6、More Effective c++----通过35个编程实例,展示专家经验,行文有趣,深处浅出。
7、The c++ standard libray---c++标准库的百科全书。
8、设计模式:可复用面向对象软件的基础


4、c

C程序设计语言(第2版·新版)---C语言“倚天屠龙双剑”---Brian W.Kernighan“C语言之父”

C Primer Plus中文版(第五版)--------C语言“倚天屠龙双剑”---Stephen Prata

C程序设计(第三版)---------------------------谭浩强

C语言大全(第四版)---------------------------HERBERT SCHILDT

C语言接口与实现:创建可重用软件的技术-------------DAVID R.HANSON  

C语言参考手册(原书第5版)--------------------------Samuel P.Harbison

C程序设计教程---------------------------------H.M.Deitel/P.J.Deitel

C陷阱与缺陷-----------------------------------Andrew Koenig  


5、VB

Visual Basic .NET技术内幕-----VB编程三剑客-----------Francesco Balena“vb首席大师”

Windows程序设计-Visual Basic.NET语言描述--VB编程三剑客-----Charles Petzold“windows编程泰山

北斗”---

.NET框架程序设计:Visual Basic.NET语言描述--VB编程三剑客--Jeffrey Richter“windows编程泰山北

斗”---,Francesco Balena“vb首席大师”  

Visual Basic 6编程技术大全------------------------Francesco Balena“vb首席大师”

Visual Basic.NET 从入门到精通-------------------------Petroutsos,E.

高级VISUAL BASIC编程-----------------------------------MATTHEW CURLAND  


6、Delphi

Inside VCL(深入核心——VCL架构剖析)----------李维

Delphi 7高效数据库程序设计--------------李维

面向对象开发实践之路(Delphi版)----------李维


7、VC

Windows 程序设计(第5版)-----Charles Petzold“windows编程泰山北斗”---

Windows核心编程----------Jeffrey Richter“windows编程泰山北斗”---

Windows高级编程指南---------Jeffrey Richter“windows编程泰山北斗”---

深入浅出MFC(第二版)-----“MFC四大天王”-------侯捷

MFC Windows程序设计(第2版)---MFC四大天王”---------Jeff Prosise

Visual C++ 技术内幕(第4版)--MFC四大天王”--------David Kruglinski

深入解析MFC-------------MFC四大天王”-----------George Shepherd

Visual C++.NET 技术内幕(第6版)-MFC四大天王”------------David Kruglinski


8、vf

Visual Foxpro程序设计参考手册-------------------张洪举

专家门诊——Visual FoxPro开发答疑160问-------------------张洪举

Visual FoxPro 6.0/9.0解决方案与范例大全-------------------张洪举

Visual FoxPro软件开发模式与应用案例-------------------张洪举

 

9、黑客

应用密码学(协议算法与C源程序-----------Bruce Schneier

网络信息安全的真相-----------Bruce Schneier

黑客大曝光:网络安全机密与解决方案(第5版)--------STUART MCCLURE

软件加密技术内幕------------看雪学院

加密与解密——软件保护技术与完全解决方案------------看雪学院

加密与解密(第二版)--------段钢


10、汇编

Intel微处理器结构、编程与接口(第六版)---------Barry B. Brey

80*86、奔腾机汇编语言程序设计---------Barry B. Brey

Windows环境下32位汇编语言程序设计(第2版)-----------罗云彬

IBM-PC汇编语言程序设计(第2版) 本书是国内优秀教材--------沈美明 温冬婵

IBM PC汇编语言程序设计(第五版) 这本书籍是国外优秀教材-------PETER ABEL著,沈美明 温冬蝉译


11、驱动开发

Windows WDM设备驱动程序开发指南------------------------------------ Chris Cant

Windows 2000/XP WDM设备驱动程序开发(第2版)--------------------------武安河

WINDOWS 2000/XP WDM设备驱动程序开发-------------------------------- 武安河


12、网络

计算机网络第四版中文版----网络编程三剑客--------------Andrew S.Tanenbaum


TCP/IP详解3卷本--------------------Richard Stevens----网络编程三剑客

UNIX网络编程2卷本--------------------Richard Stevens----网络编程三剑客

用TCP/IP进行网际互联-----------Douglas E. Comer

高级TCP/IP编程-------------------Jon C. Snader

C++网络编程-----------------------Douglas Schmidt

UNIX环境高级编程(第2版)--------------------Richard Stevens

 

13、算法

计算机程序设计艺术-------Donald.E.Knuth----------算法“倚天屠龙”双剑

算法导论-----------------Thomas H. Cormen--------算法“倚天屠龙”双剑

离散数学及其应用----------Kenneth H.Rosen

具体数学—计算机科学基础--------Donald.E.Knuth

 

14、图形编程
Windows 图形编程----------------FENG YUAN --图形编程界的Charles Petzold之书


15、数据结构

数据结构 C++语言描述》58.00(Data Structures C++) William Ford,William Topp 刘卫东 沈官林

数据结构算法与应用-C++语言描述》49.00Sartej Sahni 汪诗林 孙晓东等机械工业出版社

 

16、软件工程

设计模式--可复用面向对象软件的基础

重构—改善既有代码的设计

 

17、操作系统

深入理解计算机系统(修订版)-------RANDAL E.BRYANT

 

18、Unix


UNIX 网络编程 卷I 套接字联网API(英文版 第三版
UNIX 编程艺术
UNIX环境高级编程(英文影印第2版-----UNIX编程“圣经
UNIX环境高级编程(英文影印版)(第2版)
99-UNIX环境高级编程(第2版)
UNIX环境高级编程(第2版)---UNIX编程“圣经
UNIX网络编程 第1卷:套接口API(第3版)
UNIX网络编程卷2:进程间通信(第2版)(英文影印版)
UNIX 网络编程(第二版)第2卷:进程间通信
UNIX编程环境
UNIX 网络编程 卷I 套接字联网API(英文版 第三版
UNIX系统编程
UNIX环境高级编程
UNIX环境高级编程(英文影印版
88-LINUX内核分析及编程
UNIX 网络编程 卷I 套接字联网API(英文版 第三版)
UNIX网络编程 第1卷:套接口API(第3版)
UNIX 网络编程(第二版)第2卷:进程间通信
UNIX网络编程卷2:进程间通信(第2版)(英文影印版)
UNIX 网络编程(第2版)第1卷:套接口API和X/Open 传输接口API
UNIX网络编程(卷1):连网的APLS:套接字与XTI(第二版)(英文影印版)
UNIX环境高级编程
UNIX 环境高级编程(英文版)
UNIX环境高级编程(第2版)
Unix技术手册

 

19、Linux


Linux内核设计与实现
Linux内核完全注释
LINUX内核分析及编程
GNU/Linux 编程指南(第二版)
Linux设备驱动程序(第三版)
嵌入式设计及Linux驱动开发指南——基于ARM 9处理器
Linux设备驱动程序 第三版(英文影印版)
Linux内核设计与实现(第2版)
Linux内核设计与实现(英文影印版)(第2版)
linux技术手册


20、游戏编程

Windows游戏编程大师技巧(第二版
游戏之旅--我的编程感悟
OpenGL超级宝典:第三版
OpenGL编程指南(第四版)
Java 游戏高级编程
J2ME手机游戏编程入门
游戏之旅——我的编程感悟
游戏开发中的人工智能(英文影印版)
3D游戏:卷2 动画与高级实时渲染技术
面向对象的游戏开发
Java 游戏高级编程
3D游戏编程大师技巧
游戏编程精粹
面向对象的游戏开发
3D游戏 卷1:实时渲染与软件技术
3D游戏:卷2 动画与高级实时渲染技…
J2ME手机游戏编程入门
Direct3D游戏编程入门教程(第二版…

 

 

21、移动开发

Windows Mobile手机应用开发
SYMBIAN OS C++手机应用开发
68-Windows Mobile手机应用开发--傅曦 齐宇 徐骏
48-SYMBIAN OS C++手机应用开发 (第2卷)------------------RICHARD HARRISON著,周良忠 王伯欣译
68-SYMBIAN OS C++手机应用开发---------------RICHARD HARRISON著,周良忠译  
Windows CE.net内核定制及应用程序开发---------周毓林 宁杨 陆贵强 付林林
嵌入式系统Windows CE 开发技巧与实例--傅曦
Palm OS编程实践---绝版

 

22、单片机

单片机轻松入门----------------------------------周坚(平凡老师)  

单片机典型模块设计实例导航-----------------------求是科技

例说8051----------------------------------------张义和 陈敌北

KEIL CX51 V7.0单片机高级语言编程与ΜVISION2应用实践-----徐爱钧  

单片机应用程序设计技术(修订版)--------------------周航慈

8051单片机实践与应用-------------------------------吴金戎

MCS-51系列单片机实用接口技术---------------------李华

23、串并口通讯

Visual C++/Turbo C串口通信编程实践------------------龚建伟

VISUAL BASIC与RS-232串行通信控制(最新版)----------范逸之

 

24、电子

无线电识图与电路故障分析轻松入门(第二版) -------------------胡斌

无线电元器件检测与修理技术轻松入门(第二版) -------------------胡斌

图表细说电子技术识图-------------------胡斌

图表细说电子元器件-------------------胡斌

图表细说元器件及实用电路-------------------胡斌


 

posted @ 2009-10-09 18:47 life02 阅读(287) | 评论 (0)编辑 收藏

来自bc-cn C语言论坛

       在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的malloc()和free()两个函数的了解甚少,只知道大概该怎么用——就是malloc然后free就一切OK了。当然现在对这两个函数的体会也不见得多,不过对于本文章第三部分的内容倒是有了转折性的认识,所以写下这篇文章作为一个对知识的总结。这篇文章之所以命名中有个“浅谈”的字眼,也就是这个意思了!希望对大家有一点帮助!

       如果不扯得太远的话(比如说操作系统中虚拟内存和物理内存如何运做如何管理之类的知识等),我感觉这篇文章应该是比较全面地谈了一下malloc()和free().这篇文章由浅入深(不见得有多深)分三个部分介绍主要内容。

废话了那么多,下面立刻进入主题================》》》》》》》》》》》》》》》》》》》》》


一、malloc()和free()的基本概念以及基本用法:

1、函数原型及说明:

void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。

关于分配失败的原因,应该有多种,比如说空间不足就是一种。

void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。

2、函数的用法:

     其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:

        // Code...

        char *Ptr = NULL;

        Ptr = (char *)malloc(100 * sizeof(char));

        if (NULL == Ptr){
            exit (1);
        }

        gets(Ptr);

        // code...

        free(Ptr);

        Ptr = NULL;

        // code...

       就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。

3、关于函数使用需要注意的一些地方:

A、申请了内存空间后,必须检查是否分配成功。

B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。

C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。

D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。


二、malloc()到底从哪里得来了内存空间:

1、malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!

   说到这里,不得不另外插入一个小话题,相信大家也知道是什么话题了。什么是堆?说到堆,又忍不住说到了栈!什么是栈?下面就另外开个小部分专门而又简单地说一下这个题外话:

2、什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。

   什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。

   以上的概念描述是标准的描述,不过有个别语句被我删除,不知道因为这样而变得不标准了^_^.

   通过上面对概念的描述,可以知道:

   栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。

   堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这里说是可能,并非一定。所以我想再强调一次,记得要释放!

注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。(这点我上面稍微提过)


   所以,举个例子,如果你在函数上面定义了一个指针变量,然后在这个函数里申请了一块内存让指针指向它。实际上,这个指针的地址是在栈上,但是它所指向的内容却是在堆上面的!这一点要注意!所以,再想想,在一个函数里申请了空间后,比如说下面这个函数:

   // code...

       void Function(void)
       {
           char *p = (char *)malloc(100 * sizeof(char));
       }

       就这个例子,千万不要认为函数返回,函数所在的栈被销毁指针也跟着销毁,申请的内存也就一样跟着销毁了!这绝对是错误的!因为申请的内存在堆上,而函数所在的栈被销毁跟堆完全没有啥关系。所以,还是那句话:记得释放!

3、free()到底释放了什么

        这个问题比较简单,其实我是想和第二大部分的题目相呼应而已!哈哈!free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,前面我已经说过了,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。非常重要啊这一点!

       好了!这个“题外话”终于说完了。就这么简单说一次,知道个大概就可以了!下面就进入第三个部分:

三、malloc()以及free()的机制:

       这个部分我今天才有了新的认识!而且是转折性的认识!所以,这部分可能会有更多一些认识上的错误!不对的地方请大家帮忙指出!

       事实上,仔细看一下free()的函数原型,也许也会发现似乎很神奇,free()函数非常简单,只有一个参数,只要把指向申请空间的指针传递给free()中的参数就可以完成释放工作!这里要追踪到malloc()的申请问题了。申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。先看一下在《UNIX环境高级编程》中第七章的一段话:

       大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。

       以上这段话已经给了我们一些信息了。malloc()申请的空间实际我觉得就是分了两个不同性质的空间。一个就是用来记录管理信息的空间,另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在C语言中,用结构体来记录同一个对象的不同信息是天经地义的事!下面看看这个结构体的原型:

   struct mem_control_block {

       int is_available;    //这是一个标记?

       int size;            //这是实际空间的大小

    };

       对于size,这个是实际空间大小。这里其实我有个疑问,is_available是否是一个标记?因为我看了free()的源代码之后对这个变量感觉有点纳闷(源代码在下面分析)。这里还请大家指出!

       所以,free()就是根据这个结构体的信息来释放malloc()申请的空间!而结构体的两个成员的大小我想应该是操作系统的事了。但是这里有一个问题,malloc()申请空间后返回一个指针应该是指向第二种空间,也就是可用空间!不然,如果指向管理信息空间的话,写入的内容和结构体的类型有可能不一致,或者会把管理信息屏蔽掉,那就没法释放内存空间了,所以会发生错误!(感觉自己这里说的是废话)

       好了!下面看看free()的源代码,我自己分析了一下,觉得比起malloc()的源代码倒是容易简单很多。只是有个疑问,下面指出!

   // code...

  
       void free(void *ptr)
       {

            struct mem_control_block *free;

            free = ptr - sizeof(struct mem_control_block);

            free->is_available = 1;

            return;
       }

        看一下函数第二句,这句非常重要和关键。其实这句就是把指向可用空间的指针倒回去,让它指向管理信息的那块空间,因为这里是在值上减去了一个结构体的大小!后面那一句free->is_available = 1;我有点纳闷!我的想法是:这里is_available应该只是一个标记而已!因为从这个变量的名称上来看,is_available 翻译过来就是“是可以用”。不要说我土!我觉得变量名字可以反映一个变量的作用,特别是严谨的代码。这是源代码,所以我觉得绝对是严谨的!!这个变量的值是1,表明是可以用的空间!只是这里我想了想,如果把它改为0或者是其他值不知道会发生什么事?!但是有一点我可以肯定,就是释放绝对不会那么顺利进行!因为这是一个标记!

       当然,这里可能还是有人会有疑问,为什么这样就可以释放呢??我刚才也有这个疑问。后来我想到,释放是操作系统的事,那么就free()这个源代码来看,什么也没有释放,对吧?但是它确实是确定了管理信息的那块内存的内容。所以,free()只是记录了一些信息,然后告诉操作系统那块内存可以去释放,具体怎么告诉操作系统的我不清楚,但我觉得这个已经超出了我这篇文章的讨论范围了。

       那么,我之前有个错误的认识,就是认为指向那块内存的指针不管移到那块内存中的哪个位置都可以释放那块内存!但是,这是大错特错!释放是不可以释放一部分的!首先这点应该要明白。而且,从free()的源代码看,ptr只能指向可用空间的首地址,不然,减去结构体大小之后一定不是指向管理信息空间的首地址。所以,要确保指针指向可用空间的首地址!不信吗?自己可以写一个程序然后移动指向可用空间的指针,看程序会有会崩!

       最后可能想到malloc()的源代码看看malloc()到底是怎么分配空间的,这里面涉及到很多其他方面的知识!有兴趣的朋友可以自己去下载源
代码去看看。


四、关于其他:

        关于C中的malloc()和free()的讨论就写到这里吧!写了三个钟头,感觉有点累!希望对大家有所帮助!有不对的地方欢迎大家指出!最后,谢谢参与这个帖子讨论的所有朋友,帖子:http://www.bc-cn.net/bbs/dispbbs.asp?boardID=5&ID=81781&page=1

posted @ 2009-10-09 13:02 life02 阅读(226) | 评论 (0)编辑 收藏

malloc/free和new/delete的区别
2009年08月18日 星期二 11:26

有了malloc/free为什么还要new/delete ?
        malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

        因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见示例7-8。



class Obj

{

public :

         Obj(void){ cout << “Initialization” << endl; }

~Obj(void){ cout << “Destroy” << endl; }

void     Initialize(void){ cout << “Initialization” << endl; }

void     Destroy(void){ cout << “Destroy” << endl; }

};

void UseMallocFree(void)

{

     Obj   *a = (obj *)malloc(sizeof(obj));    // 申请动态内存

     a->Initialize();                         // 初始化

     //…

     a->Destroy();    // 清除工作

     free(a);         // 释放内存

}

void UseNewDelete(void)

{

     Obj   *a = new Obj;   // 申请动态内存并且初始化

     //…

     delete a;            // 清除并且释放内存

}


示例7-8 用malloc/free和new/delete如何实现对象的动态内存管理



类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数UseNewDelete则简单得多。

所以我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。

     既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。

posted @ 2009-10-09 13:01 life02 阅读(280) | 评论 (0)编辑 收藏

仅列出标题
共20页: First 12 13 14 15 16 17 18 19 20