簡體   English   中英

size_t ptrdiff_t和地址空間

[英]size_t ptrdiff_t and address space

在我的系統上, ptrdiff_tsize_t都是64位

我想澄清兩件事:

  • 我相信由於地址空間的限制,沒有數組可能與size_t一樣大。 這是真的?

  • 如果是,那么,是否可以保證ptrdiff_t能夠保存最大大小數組中任何指針的減法結果?

不,沒有這樣的保證。 例如,請參見: https//en.cppreference.com/w/cpp/types/ptrdiff_t

如果數組太大(大於PTRDIFF_MAX元素,但小於SIZE_MAX字節),則兩個指針之間的差異可能無法表示為std :: ptrdiff_t,則減去兩個這樣的指針的結果是未定義的。

大多數實現人為地限制最大數組大小,以確保指向同一數組的兩個指針之間的差異適合ptrdiff_t 因此,很可能在您的平台上,允許的最大數組大小約為SIZE_MAX / 2 (試一試)。 這不是“地址空間限制”,它只是您的實施內部強制執行的限制。 在此限制下,合法指針減法(“合法”=指向同一數組的兩個指針)不會溢出。

雖然語言規范不要求。 實現不需要以這種方式限制它們的數組大小,這意味着語言規范允許看似合法的指針減法溢出並產生未定義的行為。 但是大多數實現都喜歡通過限制它們的數組大小來抵御這種情況。

有關詳細信息,請參閱此處的“三個選項”: 為什么數組的最大大小“太大”?

來自[support.types.layout] / 3

類型size_t是一個實現定義的無符號整數類型,它足夠大,可以包含任何對象的字節大小。

所以你可以保證size_t可以保存你可以擁有的最大數組的大小。

ptrdiff_t遺憾的是不能保證。 來自[support.types.layout] / 2

類型ptrdiff_t是一個實現定義的有符號整數類型,它可以保存數組對象中兩個下標的差異,如8.7中所述。

哪個沒關系,但我們有[expr.add] / 5

當減去指向同一數組對象的元素的兩個指針時,結果的類型是實現定義的有符號整數類型; 此類型應與標題(21.2)中定義為std :: ptrdiff_t的類型相同。 如果表達式P和Q分別指向相同陣列對象x的元素x [i]和x [j],則表達式P-Q具有值i-j; 否則,行為未定義。 [注意:如果值i-j不在std :: ptrdiff_t類型的可表示值范圍內,則行為未定義。 - 尾注]

哪個說ptrdiff_t可能不夠大。

暫無
暫無

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

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