让你的 C 程序更有效率的 10 种方法

发表于:2012-2-02 09:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:sdtarena    来源:51Testing软件测试网采编

  注意:从递归树,我们计算fib(3)函数2次,fib(2)函数3次。这是相同函数的重复计算。如果n非常大,fib<n(i)函数增长i<n。解决这一问题的快速方法将是计算函数值1次,存储在一些地方,需要时计算,而非一直重复计算。

  这个简单的技术叫做Memoization,可以被用在递归,加强计算速度。

  fibonacci 函数Memoization的代码,应该是下面的这个样子:

int calc_fib ( int n )
{
    int val[ n ] , i;
    for ( i = 0; i <=n; i++ ) {
        val[ i ] = -1;         // Value of the first n + 1 terms of the fibonacci terms set to -1
    }
    val[ 0 ] = 1;                 // Value of fib ( 0 ) is set to 1
    val[ 1 ] = 1;            // Value of fib ( 1 ) is set to 1
    return fib( n , val );
}
int fib( int n , int* value )
{
    if ( value[ n ] != -1 ) {
        return value[ n ];              // Using memoization
    }
    else {
        value[ n ] = fib( n - 2 , value ) + fib ( n - 1 , value );          // Computing the fibonacci term
    }
    return value[ n ];                // Returning the value
}

  这里calc_fib( n )函数被main()调用。

  9、避免悬空指针和野指针

  一个指针的指向对象已被删除,那么就成了悬空指针。野指针是那些未初始化的指针,需要注意的是野指针不指向任何特定的内存位置。

void dangling_example()
{
    int *dp = malloc ( sizeof ( int ));
    /*........*/
    free( dp );              // dp is now a dangling pointer
    dp = NULL;        // dp is no longer a dangling pointer
}

void wild_example() 
    int *ptr;        // Uninitialized pointer 
    printf("%u"\n",ptr ); 
    printf("%d",*ptr ); 
}

  当遭遇这些指针,程序通常是”怪异“的表现。

  10、 永远记住释放你分配给程序的任何内存。上面的例子就是如果释放dp指针(我们使用malloc()函数调用)。

33/3<123
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号