簡體   English   中英

什么是真正未對齊的指針?

[英]What is really misaligned pointer?

未對齊的指針讓我感到害怕。 解析字符串時,我通常使用的一項有用技術是將一組字符視為一個單元。

因此,如果我將字符串與 <!-- 是表示開始評論的 4 個字符的位置進行比較,我會這樣做...

if( *(unsigned int*)string == tobe32('<!--') )
   // This is beggining of a comment possibly

如您所見,我處理了 Endianess 問題。 但是我仍然會偶然發現對齊指針問題。 好像我在字符串的索引 1 處,將它轉換為 unsigned int 指針會在 1 字節邊界上給我一個 4 字節的對象嗎?

是的,它幾乎肯定是一個未對齊的指針(a) ,轉換地址實際上不應該改變地址,只是在取消引用它時改變它的處理方式。

但是,這不一定是問題。 如果您這樣做,某些環境實際上可能會引發硬件異常(一些早期的 ARM,從內存中),有些會運行得慢一點(一些 x86),毫無疑問,有些根本不會在意。 所以這取決於你的底層環境。

但是,我真的很懷疑這個技巧的必要性,因為您必須進行字節序轉換的事實意味着它可能不像您想象的那樣有效。

我的第一個傾向是編寫一個內聯函數,單獨檢查四個字符,計時,並且只在出現真正問題時才擔心優化。 那將是這樣的:

// Check first four characters match. Pre-condition is that both
// legacy-C-strings are at least four characters in length.

inline bool match4(const char *str, const char *match) {
    if (*str++ != *match++) return false;
    if (*str++ != *match++) return false;
    if (*str++ != *match++) return false;
    return *str == *match;
}

這將是我的起始位置,而不是依賴使用鑄造的可能的非便攜式解決方案。


(a)如果你想知道某些類型的對齊要求,你可以使用 C++ alignof表達式,例如alignof(int) ,假設你有 C++11 或更好的,真的,你應該有 :-)

暫無
暫無

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

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