2013-06-28 42 views
1

通常在查看其他人的代碼時,我注意到塊的括號放置存在差異。括號和空格的位置會影響編譯器時間和/或運行時間嗎?

例如,一些使用:

int foo(){ 
    ... 
} 

而其他人使用:

int foo() 
{ 
    ... 
} 

而在之間的多種方式。這完全影響代碼的編譯速度嗎?例如,如果我有一系列的塊,如:

int foo() { ... {... {... {... {...} } } } } 

int bar() 
{ 
    ... 
    { 
     ... 
     { 
      ... 
      { 
       ... 
       { 
        ... 
       } 
      } 
     } 
    } 
} 

其中foo()和bar()是指除空白和支架放置相同。這些函數會花費不同的時間來編譯?運行時比另一個更快嗎?

如果將這個擴展到數百或數千個嵌套塊,這會有什麼不同嗎?這是否改變基於使用的編譯器?它會改變爲不同的語言,如C#,PHP,Perl等?

對不起,如果這看起來像很多一般或開放式的問題,只是一些我一直感興趣的東西。

+3

沒有絲毫。 (好吧,編譯器必須讀取整個文件,因此用很多空白填充它需要很長的時間才能讀取,但在運行時確實沒有任何區別,空白字​​符完全消失了。) – BoBTFish

+10

「請問這個如果這個擴展到數百或數千個嵌套塊,有什麼不同?「是。你會被謀殺,你所有的同事都會神祕地宣稱什麼也沒有看到。 –

+1

@ R.MartinhoFernandes理論上當然。任何真正做到這一點的人都會被吸引和分配。 – echolocation

回答

1

函數會花費不同的時間來編譯?運行時比另一個更快嗎?如果將這個擴展到幾百或幾千個嵌套塊,這會有什麼不同嗎?這是否改變基於使用的編譯器?它會改變爲不同的語言,如C#,PHP,Perl等?

編號編號編號幾乎所有理智的編譯器幾乎立即在lexing階段刪除空格。其他階段甚至不知道空格。但是即使這樣我也會感到驚訝(也是一個這麼大的bug,會讓它變得完全不可用)。

+0

看來我對編譯器有很多瞭解。我期待着秋季的編寫課。 – echolocation

0

編譯器會做的第一件事是執行lexical analysis去除空格,註釋等,並將輸入轉換爲一系列的標記。

全過程類似於以下,根據具體的實現:


enter image description here


由於詞法分析器通過一系列令牌到解析器任何額外的空格,托架職位等可能只會放緩勒索階段。即使如此,除非你有極端的情況,例如GB空白或者像這樣瘋狂的東西,否則這種差異不會顯而易見。