| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1712 人关注过本帖
标题:看看三目运算符?:到底是怎么回事
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
打开全局优化和速度优先是这样:

程序代码:
; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01 

    TITLE    C:\Users\TonyDeng\Documents\Visual Studio 2010\Projects\test4\test4\test.cpp
    .686P
    .XMM
    include listing.inc
    .model    flat

INCLUDELIB OLDNAMES

EXTRN    @__security_check_cookie@4:PROC
PUBLIC    _main
; Function compile flags: /Odtp /RTCsu
; File c:\users\tonydeng\documents\visual studio 2010\projects\test4\test4\test.cpp
_TEXT    SEGMENT
tv65 = -16                        ; size = 4
_max$ = -12                        ; size = 4
_b$ = -8                        ; size = 4
_a$ = -4                        ; size = 4
_main    PROC

; 2    : {

  00000    55         push     ebp
  00001    8b ec         mov     ebp, esp
  00003    83 ec 10     sub     esp, 16            ; 00000010H
  00006    b8 cc cc cc cc     mov     eax, -858993460        ; ccccccccH
  0000b    89 45 f0     mov     DWORD PTR [ebp-16], eax
  0000e    89 45 f4     mov     DWORD PTR [ebp-12], eax
  00011    89 45 f8     mov     DWORD PTR [ebp-8], eax
  00014    89 45 fc     mov     DWORD PTR [ebp-4], eax

; 3    :     int a = 1;

  00017    c7 45 fc 01 00
    00 00         mov     DWORD PTR _a$[ebp], 1

; 4    :     int b = 2;

  0001e    c7 45 f8 02 00
    00 00         mov     DWORD PTR _b$[ebp], 2

; 5    :     int max;
; 6    :
; 7    :     max = (a > b) ? a : b;

  00025    8b 45 fc     mov     eax, DWORD PTR _a$[ebp]
  00028    3b 45 f8     cmp     eax, DWORD PTR _b$[ebp]
  0002b    7e 08         jle     SHORT $LN3@main
  0002d    8b 4d fc     mov     ecx, DWORD PTR _a$[ebp]
  00030    89 4d f0     mov     DWORD PTR tv65[ebp], ecx
  00033    eb 06         jmp     SHORT $LN4@main
$LN3@main:
  00035    8b 55 f8     mov     edx, DWORD PTR _b$[ebp]
  00038    89 55 f0     mov     DWORD PTR tv65[ebp], edx
$LN4@main:
  0003b    8b 45 f0     mov     eax, DWORD PTR tv65[ebp]
  0003e    89 45 f4     mov     DWORD PTR _max$[ebp], eax

; 8    : }

  00041    33 c0         xor     eax, eax
  00043    8b e5         mov     esp, ebp
  00045    5d         pop     ebp
  00046    c3         ret     0
_main    ENDP
_TEXT    ENDS
END

授人以渔,不授人以鱼。
2011-09-04 20:14
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
优化之后我也没看出什么变化。

那个 tv65 应该是编译器自己生成的吧。我也不明白为什么它要多用一个内存变量来存那个表达式的结果。
2011-09-04 22:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 8楼 dreamofgod
查了一下資料,據説根據運算是否生成邏輯結果0、1,與目標機器有關,那個東西可能是修正這個問題的。

從彙編碼看,三目運算的效率其實及不上判斷語句:按資料的説法,三目運算符實際上被編譯器擴展為if語句,並非源代碼看到的那樣,從而警告我們說不要以爲“一行清”代碼等價于高效,事實往往相反。從我編程的實踐來看也確實是這樣的——執行效率與代碼量是守恆的,高效的算法代碼經常是碼字量大的。其實有一個很簡單的例子就可以説明這個問題,一百行賦值語句比三行的循環語句快。

無論多複雜的程序,在控制臺下,也不過是一條(行)指令而已。由此可見,命令的行數與實際動作之間其實沒有必然聯係的,千萬不要以爲寫出來的文字(代碼)行數很少,就意味著執行的效率也高。printf()函數在你看來只是一個“固有的”指令,但其實它的彙編代碼成千上萬行(機器碼有2Kbyte以上,"Hello,world"程序編譯出來有8kbyte之大),是一個很複雜低效的小型解釋器(類似于BASIC解釋執行語句的設計)。同樣的輸出程序,如果你僅輸出字符串,用puts()比printf()高效得多,無論時間還是空間都是如此;就算輸出複雜的數據,用write()也比printf()強。

[ 本帖最后由 TonyDeng 于 2011-9-11 13:19 编辑 ]

授人以渔,不授人以鱼。
2011-09-11 12:54
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
收藏
得分:0 
回复 13楼 TonyDeng
说得很有道理。
----------------------
我学汇编时并没有像mov     DWORD PTR tv65[ebp], ecx这样带有变量名的语句。
硬着头皮请教了学校的老师(果然不喜欢和老师交涉……差生守则?我去)。
像mov     DWORD PTR tv65[ebp], ecx这样的,称为中间代码,并不是像普通的mov、add那样直接翻译为机器语言。

http://baike.baidu.com/view/487032.htm


[ 本帖最后由 dreamofgod 于 2011-9-11 13:47 编辑 ]

一个单片机就让我头疼不已~~~
2011-09-11 13:46
快速回复:看看三目运算符?:到底是怎么回事
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029121 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved