2013-02-05 52 views
1

我目前正在用c編寫atmel(Atmega328)的8位微控制器。在這個程序中,我有一個8位數組存儲數千個2位整數,因此它位於程序存儲空間中。目前,我在每個字節中放置了四個2位整數,但現在當我更仔細地考慮它時,它似乎很愚蠢......陣列封裝的效率:8位(字節)與16位元素?

使用16位值的數組並存儲每個位置有8個2位變量?

微控制器(atmega328p)是一個8位IC,每個機器指令有16位。

+1

你是什麼意思,效率更高? – antonijn

+0

編譯然後反彙編,看看編譯器在做什麼。它可能包裝8位值到內存中,這樣你就不會失去內存的一半 –

+0

@dwelch:是的,這就是它的工作原理。無論哪種方式,每個字節的progmem都有四個元素。 – duskwuff

回答

1

它會更有效率嗎?

空間效率

2位整數佔用2位。你不能做更多的事情。

時間效率

不管你怎麼收拾他們,你仍然需要執行相同數量的位操作,以從更大的價值提取您的2位數字。

+1

除非OP正在清除數組或更新一次超過一個2位整數的值。 –

+0

該數組位於程序存儲器中,這在AVR上幾乎是只讀的。 – duskwuff

+0

我認爲這個問題佔用了8位數組和8位數據丟棄的16位位置(4 2位數據而不是8 2位數據)。我不認爲這是一個問題。 –

1

由於這是具有8位的8位處理器寄存器它不會改善的事情在彙編語言編程時對16位的操作數進行操作。但是對於c編譯器來說事情更復雜。這是絕對有可能,編譯器8位操作數轉換成執行16位計算的16位操作數,與int大小通常至少爲16位,幾乎我知道有編譯器。

所以解體是真的要走的路。