本文向你介绍规范你的C代码的10种方法(引用地址http://forum.eepw.com.cn/thread/250025/1)。
 
1. 避免不必要的函数调用
考虑下面的2个函数:
void str_print( char *str )
{
    int i;
    for ( i = 0; i < strlen ( str ); i++ ) {
        printf("%c",str[ i ] );
    }
}
void str_print1 ( char *str ) 
    int len; 
    len = strlen ( str ); 
    for ( i = 0; i < len; i++ ) { 
        printf("%c",str[ i ] ); 
    } 
}
请注意 这两个函数的功能相似。然而,第一个函数调用strlen()函数多次,而第二个函数只调用函数strlen()一次。因此第二个函数性能明显比第一个好。
2、避免不必要的内存引用
这次我们再用2个例子来对比解释:
int multiply ( int *num1 , int *num2 ) 
    *num1 = *num2; 
    *num1 += *num2; 
    return *num1; 
}
int multiply1 ( int *num1 , int *num2 ) 
    *num1 = 2 * *num2; 
    return *num1; 
}
同 样,这两个函数具有类似的功能。所不同的是在第一个函数( 1 for reading *num1 , 2 for reading *num2
and 2 for writing to *num1)有5个内存的引用,而在第二个函数是只有2个内存引用(one for reading
*num2 and one for writing to *num1)。现在你认为哪一个好些?
3、节约内存(内存对齐和填充的概念)
struct {
    char c;
    int i;
    short s;
}str_1;
struct { 
    char c; 
    short s; 
    int i; 
}str_2;
假设一个字符需要1个字节,short占用2个字节和int需要4字节的内存。起初,我们会认为上面定义的结构是相同的,因此占据相同数量的内存。然而,而str_1占用12个字节,第二个结构只需要8个字节?这怎么可能呢?
请注意,在第一个结构,3个不同的4个字节被分配到三种数据类型,而在第二个结构的前4个自己char和short可以被采用,int可以采纳在第二个的4个字节边界(一共8个字节)。
4、使用无符号整数,而不是整数的,如果你知道的值将永远是否定的。
 有些处理器可以处理无符号的整数比有符号整数的运算速度要快。(这也是很好的实践,帮助self-documenting代码)。
5、在一个逻辑条件语句中常数项永远在左侧。
int x = 4;
if ( x = 1 ) {
    x = x + 2;
    printf("%d",x);          // Output is 3
}
int x = 4; 
if ( 1 = x ) { 
    x = x + 2; 
    printf("%d",x);   // Compilation error 
}
使 用“=”赋值运算符,替代“==”相等运算符,这是个常见的输入错误。
常数项放在左侧,将产生一个编译时错误,让你轻松捕获你的错误。注:“=”是赋值运算符。 b = 1会设置变量b等于值1。
“==”相等运算符。如果左侧等于右侧,返回true,否则返回false。
6、在可能的情况下使用typedef替代macro。当然有时候你无法避免macro,但是typedef更好。
typedef int* INT_PTR;
INT_PTR a , b;
# define INT_PTR int*
INT_PTR a , b;
在这个宏定义中,a是一个指向整数的指针,而b是只有一个整数声明。使用typedef a和b都是 整数的指针。
7、确保声明和定义是静态的,除非您希望从不同的文件中调用该函数。
在同一文件函数对其他函数可见,才称之为静态函数。它限制其他访问内部函数,如果我们希望从外界隐藏该函数。现在我们并不需要为内部函数创建头文件,其他看不到该函数。
静态声明一个函数的优点包括:
A)两个或两个以上具有相同名称的静态函数,可用于在不同的文件。
B)编译消耗减少,因为没有外部符号处理。
让我们做更好的理解,下面的例子:
/*first_file.c*/
static int foo ( int a )
{
/*Whatever you want to in the function*/
}
/*second_file.c*/
int foo ( int )
int main()
{
    foo();      // This is not a valid function call as the function
foo can only be called by any other function within first_file.c where
it is defined.
    return 0;
}
8、使用Memoization,以避免递归重复计算
考虑Fibonacci(斐波那契)问题;Fibonacci问题是可以通过简单的递归方法来解决:
int fib ( n )
{
    if ( n == 0 || n == 1 ) {
        return 1;
    }
    else {
        return fib( n - 2 ) + fib ( n - 1 );
    }
}
注:在这里,我们考虑Fibonacci 系列从1开始,因此,该系列看起来:1,1,2,3,5,8,...
注意:从递归树,我们计算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()函数调用)

C 程序提升效率的10种方法的更多相关文章

  1. Microsoft.VisualBasic.dll的妙用and 改善C#公共程序类库质量的10种方法

    Microsoft.VisualBasic.dll的妙用(开发中肯定会用到哦) 前言 做过VB开发的都知道,有一些VB里面的好的函数在.NET里面都没有,而Microsoft.VisualBasic. ...

  2. 让C程序更高效的10种方法(转)

    原文:http://blog.jobbole.com/1198/ 代码之美,不仅在于为一个给定问题找到解决方案,而且还在代码的简单性.有效性.紧凑性和效率(内存).代码设计比实际执行更难 .因此,每一 ...

  3. 让C程序更高效的10种方法

    http://blog.jobbole.com/1198/ 代码之美,不仅在于为一个给定问题找到解决方案,而且还在代码的简单性.有效性.紧凑性和效率(内存).代码设计比实际执行更难 .因此,每一个程序 ...

  4. 改善C#公共程序类库质量的10种方法

    最近重构一套代码,运用以下几种方法,供参考. 1  公共方法尽可能的使用缓存 public static List<string> GetRegisteredCompany() { Str ...

  5. 改善C#公共程序类库质量的10种方法和工具

    最近重构一套代码,运用以下几种方法,供参考. 1  公共方法尽可能的使用缓存 public static List<string> GetRegisteredCompany() { Str ...

  6. 改善C#公共程序类库质量的10种方法(转)

    出处:http://www.cnblogs.com/JamesLi2015/p/3140897.html 最近重构一套代码,运用以下几种方法,供参考. 1  公共方法尽可能的使用缓存 public s ...

  7. 人工智能改进传统云ERP的10种方法

    http://blog.itpub.net/31542119/viewspace-2168809/ 随着数字化转型的进程加快,企业开始重新评估ERP的作用.传统ERP经过多年僵硬化定制过于追求生产的一 ...

  8. 提高SQL查询效率的30种方法

    转载:提高SQL查询效率的30种方法 内容摘录如下: 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中 ...

  9. 为了弄懂Flutter的状态管理, 我用10种方法改造了counter app

    为了弄懂Flutter的状态管理, 我用10种方法改造了counter app 本文通过改造flutter的counter app, 展示不同的状态管理方法的用法. 可以直接去demo地址看代码: h ...

随机推荐

  1. C++异常处理小例

      学习程序的好方法是阅读代码和改进代码.下面的程例来自<An Overview of the C++ Programming Language>(5.1 异常和错误处理)程序用途:使用C ...

  2. cf B. Flag Day

    http://codeforces.com/contest/357/problem/B #include <cstdio> #include <cstring> #includ ...

  3. nodejs教程

    http://www.yiibai.com/nodejs/ http://www.runoob.com/nodejs/nodejs-tutorial.html http://www.runoob.co ...

  4. How to install phpmyadmin on centos 6

    Phpmyadmin :   Phpmyadmin is a free tool used to administrate MySQL . Phpmyadmin supports all major ...

  5. Windows下MySQL双向同步及环形同步的实现

    记录一下这次做的双向同步及环形同步吧,都是最简单的实现: 具体实现之前,先说些与之有关的内容吧,大部分内容都是网上的,操作步骤则是亲自测试之后记录下的: 一. 数据同步的几种方式: 1. 触发器,在数 ...

  6. [置顶] API相关工作过往的总结之Sandcastle简要使用介绍

    Sandcastle介绍 在微软推出Sandcastle之前,人们倾向于选择开源的NDoc(.NET代码文档生成器).NDo可以将 C#.NET 编译生成的程序集和对应的 /doc XML文档,自动转 ...

  7. THREE.JS + Blender(obj、mtl加载代码)

    2016-11-04 09:23:17 THREE.REVISION "81dev" Blender     "2.78" 1.加载OBJ.MTL文件 // T ...

  8. 【转载自i春秋】图片马合成方法

    1.将图片和一句话木马放在同一个文件夹 2.创建快捷方式,将起始位置修改为图片和txt文本的路径. 3.进行合成,命令如下 copy .png /b + .txt /a .png 4.成功!自行测试. ...

  9. (转载)XML Tutorial for iOS: How To Read and Write XML Documents with GDataXML

    In my recent post on How To Choose the Best XML Parser for Your iPhone Project, Saliom from the comm ...

  10. first day for new job

    第一天上班,做个总结. 总得来说,感觉非常不错,一个结论~保持头脑清醒,好好加油. 今天主要办一些入职手续,拿到了代码,后面几天主要就是熟悉应用的功能.源代码.想好好制定个计划,定日目标. 1.功能结 ...