打印

[讨论]用C语言写代码,如何优化代码尺寸大小

[复制链接]
楼主: 古道热肠
手机看帖
扫描二维码
随时随地手机跟帖
41
naren| | 2009-7-4 02:16 | 只看该作者 回帖奖励 |倒序浏览

回楼上

如果用好的算法来查表,就不说了。
对于用简单查表,就没有switch好,尤其是当case很多的情况下,尤其是case值离散的情况下。

使用特权

评论回复
42
古道热肠|  楼主 | 2009-7-4 12:22 | 只看该作者

指针指明对象后效率还是蛮高的吧

51单片机内存就有好几种,有data idata pdata xdata code,通用指针需要对所有情况都做兼容,效率是会打折扣.

使用特权

评论回复
43
gyc198215| | 2009-7-4 18:57 | 只看该作者

良好的架构;合理的类型声明;指针的正确使用;最优的算法实现;任务的分配;对内存使用的正确理解;另外相矛盾的全局变量,短地址最好,但是对实现程序良好和封装和移植却矛盾。。。。看做产品吧

使用特权

评论回复
44
naren| | 2009-7-5 01:12 | 只看该作者

记得keil C51对函数声明与否代码量有点影响

在c文件中被调用函数写在前面而不再写函数声明,编译出来的代码量会小一点。不知新版的keil是否也这样?

使用特权

评论回复
45
ayb_ice| | 2009-7-5 12:34 | 只看该作者

LS说的不可能

使用特权

评论回复
46
古道热肠|  楼主 | 2009-7-5 14:00 | 只看该作者

俺也觉得47楼的这种说法靠不住

倒是在没有参数的地方用void 明确化更有效
Demo:
void main(void)
{
}

使用特权

评论回复
47
naren| | 2009-7-5 22:00 | 只看该作者

呵呵,验证一下就知道了

刚拿出N年前写的跑马灯demo程序,把主函数main放到文件最后面,这样,其所调用的函数都在其前面定义编译后data=20.0,code=2318。

再做一个实验,把主函数main放到文件的所有函数定义的前面,main中调用的函数在其后定义,文件头部写上这些函数的原型,编译后data=20.0,code=2326。

前后对比,代码量少了8bytes!用keil v8.05a编译的。

使用特权

评论回复
48
naren| | 2009-7-5 22:16 | 只看该作者

49楼所言极是

很多细节的地方都会影响到C51的code大小。对于无需传递函数或无需返回值的函数使用void关键字,也是一个好习惯

使用特权

评论回复
49
ayb_ice| | 2009-7-6 21:16 | 只看该作者

50L

你说的情况也可能代码变大,只是你运气好,是因为程序中有很多跳转指令,KEIL自动优化成SJMP,AJMP,LJMP.

使用特权

评论回复
50
fortune158| | 2009-7-6 21:59 | 只看该作者

学习中

学习学习
同意楼主的想法
有时候我们会为了达到目的
而忽略的代码的大小

使用特权

评论回复
51
naren| | 2009-7-6 22:25 | 只看该作者

回52L

具体原因没有仔细研究,但代码中没有查表,也没有goto语句,纯粹是while(1)中几个函数顺序调用,展现不同的流水灯效果。

使用特权

评论回复
52
Airwill| | 2009-7-7 01:03 | 只看该作者

To: 47楼

我也发现这个问题, 即使在 8.X里面

使用特权

评论回复
53
machunshui| | 2009-7-7 08:22 | 只看该作者

顺序

顺序:

正确性,
健壮性,
可读性,

最后才是代码尺寸何运行速度

使用特权

评论回复
54
Txapp| | 2009-7-8 09:12 | 只看该作者

规范

同意LS,没有保证正确性、稳定性、可读性及可测性之前,
所谓代码大小都是浮云

使用特权

评论回复
55
古道热肠|  楼主 | 2009-7-8 10:35 | 只看该作者

现在的重点是优化代码,其它的肯定也会考虑的

比如以下函数,用C51写与卡交换数据时多半要用到,如何优化,希望大家提出自己的想法.
unsigned long SwapINT32(unsigned long dData)
{
               dData = ((dData&0xff)<<24) |((dData&0xff00)<<8) |((dData&0xff000000)>>24) | ((dData&0xff0000)>>8);
     
         return dData;
}

使用特权

评论回复
56
dengm| | 2009-7-8 10:37 | 只看该作者

程序结构--代码复用 算法--专用算法代替通用算法

使用特权

评论回复
57
古道热肠|  楼主 | 2009-7-8 10:50 | 只看该作者

哈哈,59楼这两句蛮是高招,算是切中要害

使用特权

评论回复
58
machunshui| | 2009-7-8 14:28 | 只看该作者

其实写程序

其实写程序,看着是写代码,

实际上是:

抽象现实问题为逻辑表达,
有的时候为了所谓的效率,复用,
过渡追求代码大小,运行效率
反而会造成过渡抽象,结果会隐含错误.


其实写程序,前人总结的无非是:

高内聚,低耦合,模块功能要单纯,


模块内部紧密联系,
外部出入口条件要少,
完成一个单纯的功能.



使用特权

评论回复
59
电子尘埃| | 2009-7-8 16:15 | 只看该作者

这些东东,把这头搞好了,尾巴就出来了

 程序结构--代码复用    算法--专用算法代替通用算法

专用法代替通用算法就把可移植给弄死了.

个人觉得 还是向着"高内聚,低耦合,模块功能要单纯"走要好.碰上PIC16C54这样的不如直接上汇编算了.
再碰上PIC16F73这样的,先按上面的走,到时装不下了,找占用最大的下手,如果还差较多就直接换芯片得了,谁知到时要加个小功能,就整死了,不如干脆直接换上大的.
所以现在搞的就很喜欢ATMEGA16与ATMEGA32这样的芯片用,小的不行,后面还有个大的等着你用.硬件电路一点也不用改

使用特权

评论回复
60
电子尘埃| | 2009-7-8 16:26 | 只看该作者

再接


就跟玩游戏一样,先把等级提高了,到时武器再慢慢去练的好.要不然再好的武器装备在新人身上也发挥不了大功效,反而伤了自已可就麻烦了.

坛内新人还是较多,期待楼上及楼上高人开坛传授码程序如何做到"高内聚,低耦合,模块功能要单纯"及硬件无关**.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则