簡體   English   中英

__attribute __((packed))會影響程序的性能嗎?

[英]Can __attribute__((packed)) affect the performance of a program?

我有一個名為log的結構,里面有13個字符。 在做了sizeof(log)之后,我看到大小不是13而是16.我可以使用__attribute __((packed))將它的實際大小設置為13但是我想知道這是否會影響程序的性能。 它是一種經常使用的結構。

我希望能夠讀取結構的大小(13而不是16)。 我可以使用宏,但如果這個結構被更改,即添加或刪除字段,我希望更新新的大小而不更改宏,因為我認為這很容易出錯。 有什么建議嗎?

是的,它會影響程序的性能。 添加填充意味着編譯器可以使用整數加載指令從內存中讀取內容。 如果沒有填充,編譯器必須單獨加載內容並進行位移以獲取整個值。 (即使它是x86,這是由硬件完成的,它仍然必須完成)。

考慮一下:如果出於性能原因,編譯器為什么會插入隨機的,未使用的空間?

不要使用__attribute__((packed)) 如果數據結構在內存中,則允許它占用編譯器確定的自然大小。 如果是用於讀取/寫入磁盤,則編寫序列化和反序列化函數; 不要簡單地在磁盤上存儲cpu-native二進制結構。 “打包”結構實際上沒有合法用途(或者很少;有關可能不同意見的觀點,請參閱此答案的評論)。

是的,它會影響性能。 在這種情況下,如果使用((packed))屬性分配此類結構的數組,則大多數結構必須以非對齊方式結束(而如果使用默認包裝,則它們都可以在16字節邊界上對齊)。 如果對齊,則復制這些結構可以更快。

是的,它會影響性能。 具體取決於它是什么以及如何使用它。

未對齊的變量可能跨越兩個緩存行。 例如,如果你有64字節的高速緩存行,並且你從一個13字節結構的數組中讀取一個4字節的變量,那么它將有四分之三(4.6%)的可能性分布在兩行中。 額外緩存訪問的代價非常小。 如果你的程序所做的一切都是在那一個變量上,那么4.6%將是性能命中的上限。 如果日志記錄代表程序工作負載的20%,並且讀取/寫入該結構是日志記錄的50%,那么您已經只占了一小部分。

另一方面,假設需要保存日志,將每個記錄縮小3個字節可節省19%,這意味着需要大量內存或磁盤空間。 主內存,特別是磁盤很慢,所以你可能最好包裝日志以減小其大小。


至於閱讀結構的大小而不用擔心結構變化,請使用sizeof 但是你喜歡做數值常量,無論是const intenum還是#define ,只需添加sizeof

與所有其他性能優化一樣,您需要分析代碼以找到正確的答案。 正確的答案因架構而異 - 以及您如何使用您的結構。

如果您正在創建巨大的陣列,則打包所節省的空間可能意味着擬合和不適合緩存之間的差異。 或者您的數據可能已經適合您的緩存,在這種情況下,它將沒有任何區別。 如果你在與分配的存儲空間來保存結構的STL關聯容器分配大量結構的operator new它可能不會在所有問題--- operator new會圓你存儲多達東西是無論如何排列。

如果你的大多數結構都存在於堆棧中,那么額外的存儲可能已經被優化掉了。

為了改變這個簡單的測試,我建議建立一個計時器,然后嘗試兩種方式。 為了進一步優化,我建議使用分析器來識別您的瓶頸並從那里開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM