簡體   English   中英

是`reinterpret_cast <char*> (reinterpret_cast的 <uintptr_t> (&ch)+ 1)==&ch + 1`保證?

[英]Is `reinterpret_cast<char*>(reinterpret_cast<uintptr_t>(&ch) + 1) == &ch +1` guaranteed?

我正在編寫與對齊相關的代碼,並且很驚訝如果給定指針正確對齊,則沒有標准函數測試。

似乎互聯網上的大多數代碼使用(long)ptrreinterpret_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_tuint64_t 無論哪種方式,將1添加到這樣的整數都不會前進到內存中的下一個字符。

能力尋址機器也可能具有比地址空間大得多的指針,並且沒有特別的理由為什么相應整數的最低有效部分應該是“地址”的一部分而不是額外信息的一部分。

當然,在實踐中,沒有人為Pr1me編寫C ++,並且能力尋址的機器似乎也沒有出現。 它適用於所有實際系統 - 但標准並不能保證。

暫無
暫無

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

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