VS2005过度优化的陷阱(二)

简介: 目前还没有新的发现,先把所有现象再次整理如下,望牛人帮忙指正。       完整代码: 1 int _tmain(int argc, _TCHAR* argv[]) 2 { 3     volatile PS3C6410_GPIO_REG pGPIO1;   // 注意:与vol...

       目前还没有新的发现,先把所有现象再次整理如下,望牛人帮忙指正。

       完整代码:

 1  int _tmain( int argc, _TCHAR* argv[])
 2 {
 3      volatile  PS3C6410_GPIO_REG pGPIO1;   // 注意:与 volatile S3C6410_GPIO_REG* pGPIO1;效果是不同的
 4 
 5     pGPIO1 = (PS3C6410_GPIO_REG)GetVirtual(S3C6410_BASE_REG_PA_GPIO,  sizeof(S3C6410_GPIO_REG));
 6 
 7     pGPIO1->GPBCON =  0x22222222;
 8     printf( " \r\n(%08x) ", pGPIO1->GPBCON);
 9      pGPIO1->GPBCON &=  0xFFFF ;   // 替换该行代码,查看其对应的汇编代码
10     printf( " -->(%08x) ", pGPIO1->GPBCON);
11      return  0;
12 }

      下面逐一替换第9行代码,并查看其对应的汇编代码。

      代码1:pGPIO1->GPBCON &= 0xFFFF;被优化掉了

     pGPIO1->GPBCON &=  0xFFFF ;
00011078  ldr         r3, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r2, pGPIO1 
00011080  ldr         r0, [pc, # 0x14
00011084  strh        r5, [r3, # 0x22
00011088  ldr         r1, [r2, # 0x20
0001108C  bl           00011498

       代码2:pGPIO1->GPBCON &= 0xFFFF<<16;也被优化掉了

     pGPIO1->GPBCON &=  0xFFFF << 16 ;
00011078  ldr         r3, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r2, pGPIO1 
00011080  ldr         r0, [pc, # 0x14
00011084  strh        r5, [r3, # 0x20
00011088  ldr         r1, [r2, # 0x20
0001108C  bl           00011498

       代码3:pGPIO1->GPBCON &= ~0xFFFF;还是被优化掉了,与代码2的汇编代码完全一样

     pGPIO1->GPBCON &= ~ 0xFFFF ;
00011078  ldr         r3, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r2, pGPIO1 
00011080  ldr         r0, [pc, # 0x14
00011084  strh        r5, [r3, # 0x20
00011088  ldr         r1, [r2, # 0x20
0001108C  bl           00011498

       代码4:pGPIO1->GPBCON &= ~(0xFFFF<<16);也未能幸免,与代码1的汇编代码完全一样

     pGPIO1->GPBCON &= ~( 0xFFFF << 16 );
00011078  ldr         r3, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r2, pGPIO1 
00011080  ldr         r0, [pc, # 0x14
00011084  strh        r5, [r3, # 0x22
00011088  ldr         r1, [r2, # 0x20
0001108C  bl           00011498

       代码5:pGPIO1->GPBCON &= 0xFF;这么写没问题!

     pGPIO1->GPBCON &=  0xFF ;
00011078  ldr         r2, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r1, pGPIO1 
00011080  ldr         r0, [pc, # 0x1C
00011084  ldr         r3, [r2, # 0x20]! 
00011088   and         r3, r3, # 0xFF 
0001108C  str         r3, [r2] 
00011090  ldr         r1, [r1, # 0x20
00011094  bl          000114A0

       代码6:pGPIO1->GPBCON &= 0xFF<<16;这么写也没问题!难道0xFF就没问题了?

     pGPIO1->GPBCON &=  0xFF << 16 ;
00011078  ldr         r2, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r1, pGPIO1 
00011080  ldr         r0, [pc, # 0x1C
00011084  ldr         r3, [r2, # 0x20]! 
00011088  and         r3, r3, # 0xFF16 
0001108C  str         r3, [r2] 
00011090  ldr         r1, [r1, # 0x20
00011094  bl          000114A0

       代码7:pGPIO1->GPBCON &= ~0xFF;又不对了!

     pGPIO1->GPBCON &= ~ 0xFF ;
00011078  ldr         r3, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r2, pGPIO1 
00011080  ldr         r0, [pc, # 0x14
00011084  strb        r5, [r3, # 0x20
00011088  ldr         r1, [r2, # 0x20
0001108C  bl           00011498

       代码8:pGPIO1->GPBCON &= ~(0xFF<<16);也被优化掉了。

     pGPIO1->GPBCON &= ~( 0xFF << 16 );
00011078  ldr         r3, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r2, pGPIO1 
00011080  ldr         r0, [pc, # 0x14
00011084  strb        r5, [r3, # 0x22
00011088  ldr         r1, [r2, # 0x20
0001108C  bl           00011498

       以上8段代码,仅2段代码正常运行,其余都有问题。已经不是运气的事了,肯定某个地方出了问题,在哪呢?

       项目的C/C++属性配置如下:

/O2 /D  " NDEBUG " /D  " _WIN32_WCE=0x600 " /D  " UNDER_CE " /D  " WINCE " /D  " _CONSOLE " /D  " ARM " /D  " _ARM_ " /D  " _UNICODE " /D  " UNICODE " /FD /EHsc /MT /fp:fast /GR- /Yu " stdafx.h " /Fp " CHSINT SDK For WinCE 6.0 (ARMV4I)\Release/GPIOApp.pch " /Fo " CHSINT SDK For WinCE 6.0 (ARMV4I)\Release/ " /Fd " CHSINT SDK For WinCE 6.0 (ARMV4I)\Release/vc80.pdb " /W3 /nologo /c /Zi /TP

       以上代码,均已“最大化速度”优化。如以“最小化大小”优化,代码如下,也有问题。

    pGPIO1->GPBCON &=  0xFFFF;
000110B0  ldr         r3, [sp] 
    printf( " -->(%08x) ", pGPIO1->GPBCON);
000110B4  ldr         r2, [sp] 
000110B8  mov         r1, # 0 
000110BC  ldr         r0, [pc, # 0x14
000110C0  strh        r1, [r3, # 0x22
000110C4  ldr         r1, [r2, # 0x20
000110C8  bl          000114D4

      若“禁用优化”,对应的代码如下,运行结果也正确。

     pGPIO1->GPBCON &=  0xFFFF ;
000110F8  ldr         r3, [sp] 
000110FC  add         r3, r3, # 0x20 
00011100  str         r3, [sp, # 0xC
00011104  ldr         r3, [sp, # 0xC
00011108  ldr         r2, [r3] 
0001110C  mov         r3, # 0xFF24 
00011110  orr         r3, r3, # 0xFF 
00011114  and         r2, r2, r3 
00011118  ldr         r3, [sp, # 0xC
0001111C  str         r2, [r3] 
    printf( " -->(%08x) ", pGPIO1->GPBCON);
00011120  ldr         r3, [sp] 
00011124  add         r3, r3, # 0x20 
00011128  ldr         r1, [r3] 
0001112C  ldr         r0, [pc, # 0x14
00011130  bl           00011544

       如果全部禁用优化,有点因噎废食的味道,还是希望能找出点原因,以免将来再次触雷。 

目录
相关文章
|
8月前
|
缓存
代码优化与过度设计:寻找平衡的艺术
作为开发人员,我们常常会面临一个棘手的问题,即如何在代码优化和过度设计之间找到平衡点?因为我们都希望通过优化代码来提升程序性能,但实际情况是稍有不慎就可能陷入过度设计的泥潭,让代码变得难以理解和维护,反而适得其反。在实际开发中,我们应该如何在这两者之间找到平衡呢?那么本文就来简单分享一些经验和方法,从而帮助我们避免陷入这种困境泥潭中。
111 3
代码优化与过度设计:寻找平衡的艺术
|
8月前
|
设计模式 IDE Java
谈谈过度设计:因噎废食的陷阱
本文探讨了设计模式在软件开发中的应用和争议,指出设计模式虽有助于应对软件复杂性,但在互联网快速迭代的背景下,可能会导致过度设计,增加理解和修改成本。文章分析了设计模式的缺陷,如开闭原则可能导致不易修改,最小知识原则可能导致理解困难。同时,文章强调了设计模式的重要性,指出它们可以提高代码的可理解性和模块的可维护性,并提出了通过函数式设计模式进行优化的示例。作者认为,设计模式需要随着业务演进而不断演进,同时提倡使用可调试的模块和模式演进来促进系统的成长性。文章最后提醒读者,要根据实际情况选择是否使用设计模式,避免因噎废食。
|
8月前
|
设计模式 算法
我确实遇到过优化代码却导致过度设计的状况
我确实遇到过优化代码却导致过度设计的状况
51 10
|
8月前
|
开发者
浅谈代码优化与过度设计
浅谈代码优化与过度设计
|
搜索推荐 UED SEO
网站是否存在着过度优化?好用的办法分享
近些年,越来越多的企业开始重视SEO优化工作,认为这是改善企业网站落后面貌的重要途径。当然对于其他的各种类型网站,同样离不开SEO优化。做网站SEO优化的目的除了能够提升网站在百度中的排名之外,还有一个重要的作用就是能够增强网站的品牌度,能够为用户提供更好的服务。
|
测试技术
代码为啥不能过度优化
代码为啥不能过度优化
85 0
|
程序员 测试技术 API
过度设计有意义吗
看着自己每次根据设计原则及模式的代码重构,虽效果不错,但也自省:如果我的每段代码都这么写,是不是过度设计?把握设计的度,需长久锤炼。行业也总结了很多原则,帮助我们把握设计的度。它们是一种思考方法、一种行为准则。
101 0
|
存储 人工智能 自然语言处理
【C缺陷与陷阱】----语义“陷阱”
那获得该下标为0的元素的指针,如果给这个指针加1,就能得到指向该数组中下一个元素的指针。也就是指针+一个整数得到的还是指针,只不过指针的位置发生改变
114 0
|
缓存 Dubbo NoSQL
祖传代码如何优化性能?
今天又带来一次性能优化的分享,这是我刚进公司时接手的祖传(坏笑)项目,这个项目在我的文章中屡次被提及,我在它上面做了很多的性能优化,比如《记一次提升18倍的性能优化》这篇文章,比较偏向某个细节的优化,本文更偏向宏观上的性能优化,可以说是个老演员了。
194 0
祖传代码如何优化性能?
|
搜索推荐 SEO
出现这些情况说明是网站过度优化
出现这些情况说明是网站过度优化
94 0