2010-01-30 69 views
1

本地函數變量初始化需要處理時間嗎?例如:本地函數變量初始化需要處理時間嗎?

void foo (void) { 
    char *str = "hello"; 
    int num = 3; 
}

或者像全局變量一樣,它們的值已經在二進制文件的只讀部分中被賦值了嗎?

換句話說:調用一個有很多局部變量的函數,比較一個沒有函數的函數會耗時嗎?

編輯: 我看到很多人在這裏感到憤怒,因爲它似乎我試圖優化我的代碼在一個非常挑剔的/糟糕的方式,這不應該被考慮。我知道這一點。我問這個問題只是爲了理解事情的行爲和功能,而不是爲了優化的原因。謝謝。順便說一句,也許我的代碼是在一個低功耗的MCU上?考慮其他選擇,PC不是唯一的選擇。

+0

指定一個變量可能需要1到4條指令。在1Ghz的處理器上,這隻會持續大約1至4納秒。 – Pace 2010-01-30 19:52:45

+2

您將定義多少個局部變量? 3百萬呢?在注意到相當長的時間之前,您將用盡堆棧空間。不要專注於微觀優化。 – kennytm 2010-01-30 19:52:45

+0

每當我看到像這樣的東西時,我都會生氣。顯然這需要時間。您必須分配一個變量並設置字符串中的所有字符。這個問題沒有定量。學習使用一個分析器,它是唯一的方法來看看你是否應該關心那種開銷,它取決於整個特定的程序。你在準確回答什麼問題? – 2010-01-30 19:55:54

回答

3

這不是很多時間,但是。這需要時間。

在此示例中,文本「hello」已經作爲常量值生活, 但str必須設置爲在運行時指向它。

和值3,將不得不存儲在num

+0

這個「某處」在哪裏?二進制文件的只讀部分? – Dor 2010-01-30 20:12:33

+0

@Dor:在MSVC中它將位於二進制文件的只讀部分,我不知道其他編譯器。 – 2010-01-30 20:15:23

+0

編譯爲程序集(例如gcc -S)並親自查看。 – 2010-01-30 20:15:41

0

如果你喜歡冒險的感覺,嘗試用objdump有和沒有額外的變量dissasembling您的可執行文件。當您在函數中創建更多局部變量時,您會看到編譯器插入了額外的指令(設置寄存器或執行加載操作)。每條指令都需要非零時間...