首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

程序优化有关问题

2012-04-17 
程序优化问题假设a,b都是unsigned char类型C/C++ codeif(a 1 && a 10){b 0}else if(a 10 && a

程序优化问题
假设a,b都是unsigned char类型
C/C++ code
if(a > 1 && a <= 10)
{
  b = 0;
}
else if(a > 10 && a <= 20)
{
  b = 1;
}
else if(a > 20 && a <= 30)
{
  b = 2;
}
else if(...)//N多个分支来判断
  .
  .
  .


 这样的代码看着着实不爽,可以优化吗?当然可以,优化如下:
C/C++ code
#define RANGE_TABLE_SIZE 10 //假设是十个判断分支
typedef unsigned char BYTE;


typedef struct tagRANGE
{
  BYTE nLower;
  BYTE nUpper;
}RANGE;

code const RANGE g_RangeTable[RANGE_TABLE_SIZE] =
{
{1, 10},
{10, 20},
{20, 30},
 ...
};

//下面为判断过程
BYTE i = 0;
for(i = 0; i < RANGE_TABLE_SIZE; i++)
{
  if(a > RangeTable[i].nLower && a <= RangeTable[i]. nUpper)
  {
  b = i;
  }
}
 我实际测试了一下,改版之前足足用了147个字节,而改版后的只是70个字节。相差竟然有一倍之多。
希望大侠帮我解析一下,为什么这样写能够节省这么多的空间呢?

[解决办法]
就这个题目来说......

if (a>0)
b=(a-1)/10;

完事了
[解决办法]
你指的是节约了什么空间?
[解决办法]

探讨

我是想知道为什么这样写能够节省空间?

[解决办法]
原来是指的生成的目标程序大小啊。我一直没明白你说的是什么......

原来的那个程序有10个if语句,那要想小也小不下来啊。后面那个程序才一个for一个if,外加一个20字节大小的数组需要初始化,比起第一个小很多也就是非常自然地了。
[解决办法]
这个要说清楚就比较麻烦了......

大致上是这样:经过编译后的目标代码里已经不再有数据类型定义、变量声明之类的内容了,那些内容被编译器固化到了具体的处理代码中,几乎不再占用目标程序的文件空间了。还要占用这个空间的主要是各个具体执行操作的语句,还有对数组的初始化映射之类的内容。

前一个程序里用了很多语句来处理各种状况,结果编译出来的目标码当然就比较大了。而后面那个把10次if放进了循环体内,使得程序员只需要写一次if就能完成原来10次的功能。这样,程序长度大大减短,编译出的目标码当然就会短小很多了。要不是初始化数组的需求,它还会更短的。
[解决办法]
循环体在源代码里只出现一次,在目标代码里通常也只会出现一次。要不然,我们测速时动不动就上千万甚至上10亿次的执行循环,那生成出来的代码还不得吓死人了?
[解决办法]
我被搞晕了,楼主你到底是说你写的源代码长度还是生成的EXE的大小?
[解决办法]
......楼主还没弄清源代码和目标程序的区别吧?你那源代码不可能短到70个字节的。
[解决办法]
源代码长度没必要纠结啊,和同一句话有不同的说法一个道理,只要说清楚了就好。就如同写作文,文言文最紧凑,可是不好看啊~

n *= 2相比n = n * 2对于编译器来说会减少生成的指令数,也就是减少EXE的大小,而且加快运行效率的。你的老师意思是用较为简洁的语法,可以编出运行得更快的程序,而运行得快不快,不是你的源代码文字长度决定的,而是你表达逻辑的方法决定的。

探讨

引用:

我被搞晕了,楼主你到底是说你写的源代码长度还是生成的EXE的大小?

源代码的长度

[解决办法]
......只有一个循环体,在for语句的控制下它会被执行10次。


[解决办法]
那啥......你们学单片机没学过对应的汇编语言吗?就算这样,我想学单片机也应该学过计算机原理什么的吧?我怎么觉得你们还什么都没学到就开始讲C了,完全对程序没有概念的样子......
[解决办法]
n*=2和n=n*2相比是更清晰地向编译器指示了运算的过程,这个和计算机中CPU的工作原理有关。

不过,现在的编译器大多都能将n=n*2这样的语句优化成n*=2一样的形式,倒是不用写程序的人太费事。

我觉得学习像单片机这样的专业似乎应该多学点计算机基础知识才对,你们能用的硬件资源少,好一点的设计和差一点的设计就可能会有很大的差别。

很佩服LZ的钻研精神,有疑点就努力弄清它。保持这样的态度你一定能学得很好。
[解决办法]
楼主可以学一下汇编,对做嵌入式绝对有好处的。

热点排行