[英]Is `reinterpret_cast<char*>(reinterpret_cast<uintptr_t>(&ch) + 1) == &ch +1` guaranteed?
我正在編寫與對齊相關的代碼,並且很驚訝如果給定指針正確對齊,則沒有標准函數測試。
似乎互聯網上的大多數代碼使用(long)ptr
或reinterpret_cast<uintptr_t>(ptr)
來測試對齊,我也使用它們,但我想知道使用帶有整數類型的轉換指針是否符合標准。
有沒有系統在這里觸發斷言?
char ch[2];
assert(reinterpret_cast<char*>(reinterpret_cast<uintptr_t>(&ch[0]) + 1)
== &ch[1]);
要回答標題中的問題:不。
反例:在舊的Pr1me迷你電腦上,普通指針是兩個16位字。 第一個字是12位段號,2個環位和一個標志位(不記得第16位)。 第二個字是段內的16位字偏移。 char *(因此void *)需要第三個單詞。 如果標志位置1,則第三個字為0或8(是尋址字內的位偏移)。 這種機器的uintptr_t
需要是uint48_t
或uint64_t
。 無論哪種方式,將1添加到這樣的整數都不會前進到內存中的下一個字符。
能力尋址機器也可能具有比地址空間大得多的指針,並且沒有特別的理由為什么相應整數的最低有效部分應該是“地址”的一部分而不是額外信息的一部分。
當然,在實踐中,沒有人為Pr1me編寫C ++,並且能力尋址的機器似乎也沒有出現。 它適用於所有實際系統 - 但標准並不能保證。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.