2016-01-13 51 views
13

因爲我的編譯器爲這兩段代碼提供了不同的統計數據,所以我想知道是什麼使它們與衆不同?這兩個表達之間有區別嗎?

第一招:

typedef const struct process_data 
{ 
    uint8_t *name; 
    void (*p_func)(void); 
} process_data_t; 

process_data_t processes = {15,16}; 

,第二個是:

typedef struct process_data 
{ 
    uint8_t *name; 
    void (*p_func)(void); 
} process_data_t; 

const process_data_t processes = {15,16}; 

注意const預選賽已經從typedefing到結構的定義移動。對我而言,這兩個摘錄之間沒有區別,但編譯器/鏈接器統計信息表明,使用第二段代碼時會消耗更少的閃存(該平臺是資源受限的微控制器)。

+1

看看'map'文件的差異。並回報:) –

+0

請提供一個更完整的例子,足以顯示問題。 –

回答

4

有自由,編譯器可以在解釋這些聲明,但是,在一般的一些量,這裏的區別是:

  • typedef「說」:這是一個類型,它是永遠const,這意味着沒有「合法」的方式來取消const-任何這種類型的變量。每當你傳遞這個類型的數據或指針時,它們都是const。當然,投射「有效」,但只能投射到另一種類型,並可能導致未定義的行爲。

  • const數據「說」:這個數據是const,但是,這種類型的其他數據可能不是,那麼,至少一些「帶走const -nes」量是這個變量和指針之間確定類型。當然,如果有人將指向這個數據的指針指向非const並且它確實在只讀內存中,那麼我們遇到了麻煩。

所以,底線是一樣的,但有一個細微的差異。編譯器如何解釋這真的取決於編譯器。很可能,typedef非常罕見(這是我的經驗),所以編譯器針對更常見的情況進行了優化。

+0

是的,我發現這是一個編譯器特定的問題。它將一個常量解釋爲置於閃存(ROM)內存中。這裏真正的問題是,在這個編譯器中,一個'const'似乎是一個特別的'per variable'聲明。它不會通過類型傳播。所以我好像浪費了你的時間,我很抱歉。無論如何,謝謝大家。 – Hairi

0

consts被存儲在只讀存儲器 - 我的猜測是你只是轉移數據的位置。很難說100%沒有看到更多的信息。

+3

「const」限定的對象不一定存儲在只讀存儲器中。考慮'const int r = rand();'。 –