最近當我正在瀏覽代碼時,我發現#pragma DATA_ALIGN(var,4 * 1024)。 var是一個大約20k長的結構變量。我在網上搜索了這個,找不到任何有用的東西。任何人都可以提供給我的鏈接或對此有所瞭解?什麼是C中的編譯指示對齊?
回答
這意味着var
結構將進行頁面對齊(大多數計算機體系結構中的標準頁面大小爲4K = 4096字節),即它將存儲在地址可分割4096的位置。這種方法提高了性能,因爲OS通過做所謂的page fault
從磁盤(即paged memory
)獲取等於頁面大小的數據塊中的數據。每個page fault
是處理器和I/O系統的附加工作。儘量減少page faults
的數量是提高性能的強有力手段。如果數據不是頁面對齊的,訪問它可能需要額外的page fault
,而只需要一部分帶來的數據。
編輯: 雖然在大多數情況下,對準4K是由於內存管理,有可能是其他原因調整,主要是硬件的限制 - 如被正確地指出的@CodePainters。
雖然很可能你是對的,但你不知道目標系統和應用程序 - 這種對齊的原因可能完全不同(例如嵌入式片上系統中的DMA控制器要求)。 –
@CodePainters你說得對,我會添加到答案。 – SomeWittyUsername
非常豐富。我也找不到有關這方面的很多信息。非常感謝你。 –
#pragma指令爲每個編譯器提供了一種方法,可以提供機器和操作系統特有的功能,同時保持與C和C++語言的整體兼容性。 Pragma根據定義是機器或操作系統特定的,並且通常對於每個編譯器都不相同。
我認爲http://www.songho.ca/misc/alignment/dataalign.html將有助於理解數據對齊。 &正如你所說的var是一個大小約爲20k的結構,那麼爲這個結構分配的內存將與頁面對齊& @ icepack的答案已經解釋了它。
- 1. gcc內存對齊編譯指示
- 2. c#編譯指示的作用域是什麼
- 3. 什麼是未對齊的指針?
- 4. C++編譯指示與包
- 5. 爲什麼不是這個庫鏈接一個編譯指示?
- 6. 什麼是「DNS_BLOCK_ASSERTIONS」(C編譯器標誌)?
- 7. 爲什麼CUDA編程指南中char3的對齊大小是1?
- 8. C中的指針樂趣爲什麼不能編譯?
- 9. 爲什麼嚴格的編譯指示在Perl中失敗$ a?
- 10. 編譯器優化在C/C++中創建對象的界限是什麼
- 11. 在C程序的彙編代碼中,.comm對齊的含義是什麼
- 12. Cocoa中的@package編譯器指令是什麼?
- 13. 在IBM Jikes中編譯的指令是什麼
- 14. Sprite Kit/Objective C:什麼是對象的「觸摸指示器」
- 15. 在C編程中,編譯時什麼是`undefined reference`error?
- 16. C++編譯器對齊 - 只是字符沒有填充
- 17. C編譯器編譯過程中的詞法和語法分析是什麼?
- 18. 編譯後代碼中的'()'是什麼?
- 19. class_addIvar在Objective-C中的對齊方式是什麼?
- 20. 什麼是Fortran編譯器?
- 21. 模板,什麼是編譯
- 22. 什麼是 「@」 是指在C#
- 23. 什麼是*是指在C
- 24. 綁定到Delphi XE4編譯器的條件編譯器指令是什麼?
- 25. 新Haswell AVX「收集」指令的對齊限制是什麼?
- 26. 針對C#的交叉編譯器對java的限制和優勢是什麼?
- 27. 在C和C++中,const指針指針指的是什麼?
- 28. SunStudio C++編譯器編譯指示禁用警告?
- 29. 什麼是C(或ML)在創建編譯器中的角色?
- 30. 什麼是編譯器標記C#中的數字?
一般而言'#pragma'是編譯器特定的,至少應該包含一些關於所用編譯器的信息。 –