[英]size_t ptrdiff_t and address space
在我的系統上, ptrdiff_t
和size_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.