2013-11-25 37 views
2

我工作的一些Arduino的代碼,並有下面的代碼:這些方法爲什麼使我的程序變得更大?

uint8_t world[24][2][3]; 
bool getDispPixel(uint8_t x, uint8_t y, uint8_t num) 
{ 
    static uint8_t rowByte = 0; // 0 means top 8, 1 means bottom 8 
    static uint8_t rowBit = 0; 

    if(y > 7) 
    { 
     rowByte = 1; 
     rowBit = x - 8; 
    } 
    else 
    { 
     rowByte = 0; 
     rowBit = x; 
    } 

    return (world[x][rowByte][num] & (1 << rowBit)) > 0; 
} 

void setDispPixel(uint8_t x, uint8_t y, uint8_t num, bool state) 
{ 
    static uint8_t rowByte = 0; // 0 means top 8, 1 means bottom 8 
    static uint8_t rowBit = 0; 

    if(y > 7) 
    { 
     rowByte = 1; 
     rowBit = x - 8; 
    } 
    else 
    { 
     rowByte = 0; 
     rowBit = x; 
    } 

    if(state) 
     world[x][rowByte][num] |= (1 << rowBit); 
    else 
     world[x][rowByte][num] &= ~(1 << rowBit); 
} 

什麼奇怪的是這些方法增加尺寸的一噸的計劃。即使只是其中的一部分。如果我僅從其中一種方法註釋掉以下部分,它會從程序大小中刪除2536個字節!

if(y > 7) 
{ 
    rowByte = 1; 
    rowBit = x - 8; 
} 
else 
{ 
    rowByte = 0; 
    rowBit = x; 
} 

這兩種方法都經常被調用,超過200次的組合。如果他們被標記爲內聯,我會相信它,但他們不是。任何想法可能會導致這一點?

更新:如果我完全註釋掉這些方法的內容,它會減小20k的大小!看起來每次調用該函數都會消耗94個字節。不知道爲什麼......

+0

你在用什麼IDE?你能生成一個混合的彙編/源代碼清單嗎? – Greycon

+0

普通Arduino IDE。不知道該怎麼做 –

+0

你正在使用哪種操作系統? (對於可用的工具) –

回答

5

如果Arduino的工具鏈支持GCC擴展(和一些快速搜索顯示它),那麼你可以使用__attribute__((noinline))對這些功能禁用內聯像這樣:

bool getDispPixel(uint8_t x, uint8_t y, uint8_t num) __attribute__((noinline)); 
bool getDispPixel(uint8_t x, uint8_t y, uint8_t num) 
{ 
    // body of the function here 
} 

void setDispPixel(uint8_t x, uint8_t y, uint8_t num, bool state) __attribute((noinline)); 
void setDispPixel(uint8_t x, uint8_t y, uint8_t num, bool state) 
{ 
    // body of the function here 
} 

額外行看起來多餘的,但是,這不是「T。這就是擴展的語法。

+0

你真棒...切斷了將近18k字節! –

+0

現在我只希望我知道爲什麼它首先將他們內聯! :P –

+0

如果編譯器正在對速度進行優化,則可以將它們內聯。 –

2

這裏是輸出: nm --print-size --size-sort --radix=d --demangle GOLClock.cpp.o (按大小排名的對象的大小):

http://pastebin.com/rHEhuEKg

你可以看到,對於功能SetDispPixel彙編代碼需要148個字節,功能爲GetDispPixel 94個字節。

如果它導致你的二進制文件的巨大增加,這可能意味着你的函數正在被內聯。

+0

很酷。疑難雜症。這就是我所懷疑的。但無論如何要確定爲什麼,如果是這樣,如何阻止它? –

+0

有沒有辦法打印出所有內置函數? –

+0

您可以在整個可執行文件上運行相同類型的命令,而不是在單個目標文件上確定哪些函數被內聯。 –

相關問題