2017-04-19 78 views
2

長期用戶,這裏是第一次海報。我找了一個類似的問題,但一直無法找到任何東西。如果我在#define中使用固定公式,是否比使用數字效率低?

我正在通過KeilμVision上C語言編寫的一些Cortex-M3工作代碼工作。

在記錄ADC值的函數中,使用比例因子將位從位轉換回電壓。

我的問題是圍繞縮放因子,這是在頭文件中定義:

#define INPUT_VALUE_MAX (uint16_t)((1<<12)-1)

因此,這等於4095,這是有道理的,因爲它是一個12位ADC。我的問題是,將公式「INPUT_VALUE_MAX」的值定義爲公式意味着每次使用它時,微控制器都必須重新計算該值。

簡單,做:

#define INPUT_VALUE_MAX (uint16_t)((1<<12)-1)

會比更多的處理時間:

#define INPUT_VALUE_MAX (uint16_t)4095

在此先感謝任何人可以提供的幫助!

+0

根據使用的編譯器,它重寫第一個像優化的第二個,所以我認爲它是相同的。 –

+1

(幾乎?)所有的編譯器都會在編譯時評估常量,並在代碼中粘貼'4095'。 – TripeHound

+0

太棒了!謝謝你的迅速和有益的迴應! –

回答

3

不,它不需要任何運行時間處理時間。整個宏是一個整型常量表達式,這意味着它將在編譯時計算。

如果看一下生成的彙編,你會看到的是,表達由恆定4095


常量表達式被C這樣定義取代,C11 6.6:

在翻譯過程中可以評估一個常量表達式而不是運行時,因此可以用於常數可能爲 的任何地方。

約束

常量表達式不得含有賦值,遞增,遞減函數調用,或逗號經營者,當它們被包含未評估的子表達式中除。

每個常量表達式應評估爲一個常數,該常數值在其類型的可表示值範圍內。

/-/

一種整數常量表達式應具有整數型,並應 僅具有是積分常數,枚舉常數, 字符常數,sizeof表達式其結果是整數操作數 常量,_Alignof表達式和浮點常量,它們是類型轉換的立即操作數 。在整數常量 表達式中的演員算符只能將算術類型轉換爲整數類型 ,除了作爲sizeof或_Alignof運算符的操作數的一部分。

+0

非常感謝您的詳細解答! –

相關問題