打印

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

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

说的太抽象,能否具体点?

使用特权

评论回复
22
beinghu| | 2009-7-2 09:41 | 只看该作者

写汇编吧 每个字节自己掌控呢

使用特权

评论回复
23
一朝成名| | 2009-7-2 09:45 | 只看该作者

俺个人认为研究代码大小不如研究代码的效率问题

使用特权

评论回复
24
xwj| | 2009-7-2 10:58 | 只看该作者

赞同LS

使用特权

评论回复
25
HWM| | 2009-7-2 11:03 | 只看该作者

有时候,研究代码效率不如研究代码的可读性(其实是一种

其实代码效率包括时间(速度)和空间(大小)。

使用特权

评论回复
26
dwq175| | 2009-7-2 14:10 | 只看该作者

全局变量不要用到中断应该不会出现预想不到的效果

全局变量不要用到中断应该不会出现预想不到的效果.

使用特权

评论回复
27
古道热肠|  楼主 | 2009-7-2 14:25 | 只看该作者

汇编做应用层设计是不可取的,弄不好不见得能节省代码空间

有时代码速度和代码空间是能二者兼得的.俺就遇到过一类段代码,贴出来给大家看看.
下面是新的代码,采用联合体拆解数据.

uint8 SD_read_sector(uint32 addr,uint8 xdata *Buffer)
//****************************************************************************
{

   uint8 idata CMD[6]; 
    union SDSector
    {
        uint32  ulAddress;
        uint8  ucADDByte[4];
    } CurrentSDSector;

   CMD[0] = 0X51;
   CMD[4] = 0X00;
   CMD[5] = 0XFF;

   addr = addr << 9; //addr = addr * 512
   CurrentSDSector.ulAddress =addr;

   CMD[1] = CurrentSDSector.ucADDByte[0];
   CMD[2] = CurrentSDSector.ucADDByte[1];
   CMD[3] = CurrentSDSector.ucADDByte[2];

   return SD_Read_Block(CMD, Buffer);      
}

下面是老的代码,用的是程序变换,不仅占空间,而且费时间,但看起来较容易理解,可读性貌视很好.

uint8 SD_read_sector(uint32 addr,uint8  *Buffer)
//****************************************************************************
{
   uint8  CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF}; 
   
   addr = addr << 9; //addr = addr * 512

   CMD[1] = ((addr & 0xFF000000) >>24 );
   CMD[2] = ((addr & 0x00FF0000) >>16 );
   CMD[3] = ((addr & 0x0000FF00) >>8 );

   return SD_Read_Block(CMD, Buffer, 512);
        
}

使用特权

评论回复
28
三块石头| | 2009-7-2 14:41 | 只看该作者

不太同意1L的关于能用uchar就不用uint的说法

比如32位arm,uint(32bit)自增自减比uchar自增自减快,因为uchar是uint做自增自减再做位屏蔽得到的

使用特权

评论回复
29
ayb_ice| | 2009-7-2 21:05 | 只看该作者

全局变量传递参数效率最高

但必须设置好访问原则,否则很容易出乱

使用特权

评论回复
30
zgf009| | 2009-7-2 21:56 | 只看该作者

数组和指针不一样

首先说明,数组名并不是指针.所以也就不能说什么为什么把数组和指针独立起来的问题了.数组名的内涵在于它所指向的实体是一种数据结构,而这种数据结构就是--数组.数组名的外延在于它可以转换为指向它所指代的实体的指针,而且是一个常量指针(ps:11楼).而且我们常说的指向数组的指针又是另一种变量类型了,它仅仅意味着数组存放的地址而已.
另外需要格外注意的是:数组名作为函数形参时,在函数体内,它失去了本身的内涵,彻底成为一个指针,并且它也失去了他的常量特性(也就是说,它可以自加,自减,可以被修改).(我们不能总是相信教科书上的东西,学校只能教我们要怎么做,具体怎么做要自己学习)
20楼的说法是对的,为了避免作用域的无限膨胀,我们要在妥善处理信息的同时尽量缩短变量的生存周期.而且,这也是为了便于维护和方便别人阅读代码.在C++中更要注意这样的问题.

使用特权

评论回复
31
阿穆琪| | 2009-7-3 08:35 | 只看该作者

赞同3L

良好的结构、可维护性>..效率>.....实现难度>.>.....................................................................................................................................................................代码优化

大部分情况,代码优化是由编译器去做的事情,换个编译器多块好省;
还有部分情况,是由单片机厂商做的事情,加点FLASH不值什么钱;

使用特权

评论回复
32
古道热肠|  楼主 | 2009-7-3 11:19 | 只看该作者

不同意楼上的看法,加点Flash不值什么钱,有量时就值钱了

编译器有时对愚蠢的(换言之,不太高效)的程序写法是无能为力的.

使用特权

评论回复
33
古道热肠|  楼主 | 2009-7-3 11:26 | 只看该作者

非常同意32L的说法,对指针与数组两者分析的很是透彻

指针对元素的操作,尤其是遍历操作非常高效.
俺猜想可能是指针编译时使用了高效的汇编寻址中的基址变址来实现内存操作有关.
数组单元的寻址应变是基地址+偏移量为每一个数组单元的访问寻址的吧.

使用特权

评论回复
34
bhsdlmj| | 2009-7-3 12:14 | 只看该作者

可读性重要些。别的就无所谓了!

使用特权

评论回复
35
阿穆琪| | 2009-7-3 13:14 | 只看该作者

性价比

别老拿单片机说事,量大怎么怎么样,真正有多少人能做称的上量的东西?大部分电工做的东西能上多少量,能到100psc不?

就大部分东西来说(坛子里讨论的那些),一个单片机能占成本的比例很小。有时连个接插件都比不上,为几毛钱把自己折腾的死去活来,何必呢。

非常赞同3L,做大事不拘小节。

使用特权

评论回复
36
Airwill| | 2009-7-3 15:05 | 只看该作者

怎么这么多人跑题呢?

事实上, 更小的代码未必就是没有了可读性!
很多地方还得对编译器特性细节的把握.
比如关于 指针和数组的问题.
在 KEIL C 下, 可是数组的代码效率高于指针.

这么好的论题, 怎么没有看见两位高手: dengm 和 hotpower 参加呢?

使用特权

评论回复
37
itelectron| | 2009-7-3 21:17 | 只看该作者

他们两 是好久 没有见了

使用特权

评论回复
38
naren| | 2009-7-3 23:43 | 只看该作者

同意39L

在函数中使用多个指针变量,往往编译出来代码量更大!

使用特权

评论回复
39
naren| | 2009-7-3 23:49 | 只看该作者

使用代码冗余可以优化代码!

使用switch case时,if else判断复杂条件时,应该尽量增加冗余代码,提高几个判断条件的相似度。可以类比数字逻辑电路的卡诺图优化。

使用特权

评论回复
40
walnutcy| | 2009-7-4 00:36 | 只看该作者

复杂的switch改查表不是更好,

使用特权

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

本版积分规则