我有一個C函數,它需要一個uint8_t *
參數,它必須指向32位對齊的內存。是否有可能在C或C++或任何特定平臺的宏中爲參數添加一些修飾,以便編譯器或鏈接器在構建時拋出錯誤(如果未按需要對齊)?可能強制內存對齊C中的指針參數?
這裏的想法是,我想保護功能,防止其他用戶(或我在6個月內)使用不當。我知道如何調整我想傳遞給它的東西。我想確保沒有人可以通過將錯誤的東西傳遞給它。
基於this answer,我想回答我的問題是「不」,這是不可能在編譯時強制執行這一點,但它似乎是一個非常有用的功能,所以我想我會檢查。我的解決方法是將assert((((size_t)ptr) % 4) == 0);
放入函數中,所以至少我可以在調試時在運行時捕獲它。
根據我的經驗,如果您在許多嵌入式平臺上投下未對齊的uint8_t*
到uint32_t*
,結果是不確定的,所以我不想指望最終出現的「正確」結果。另外,這是在實時系統上使用的,所以減速可能是不可接受的。
引用歡迎,如果有的話。
當然不是XY問題?英特爾的錯位訪問幾乎沒有任何損失,而在嚴格的對齊架構上,無論如何都會導致SIGBUS。 – SergeyA
你會如何期待* buld時間的錯誤?這需要編譯器很多,如果我做了'uint8_t * sneaky =(uint8_t *)1; alignmentRequiringFunction(欺騙性);'?或者,如果'偷偷'的價值來自'fgets()'?一個解決方法,至少向調用者表明你期望的是將該參數改爲'uint32_t *',因爲這意味着期望自然對齊。 – unwind
@SergeyA,我不認爲它是[XY](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。我問的是我認爲適當的解決方案。另外,我編輯了你的評論的其餘部分。 –