[英]Does size_t have the same size and alignment as ptrdiff_t?
在我的平台上(我認為在大多數平台上) std::size_t
和std::ptrdiff_t
具有相同的大小和相同的 alignment。 有沒有不正確的平台? 簡而言之:標准是否要求?
簡而言之:標准是否要求?
不,唯一的要求來自[support.types.layout]/2 ,它是:
ptrdiff_t 類型是實現定義的有符號 integer 類型,它可以保存數組 object 中兩個下標的差異,如 [expr.add] 中所述。
有第4段
[注意:建議實現為 ptrdiff_t 和 size_t 選擇其 integer 轉換等級不大於signed long int 的類型,除非需要更大的大小來包含所有可能的值。 ——尾注]
但是注釋是非規范性的,它只是一個建議,而不是一個要求。
std::size_t
定義為
size_t 類型是實現定義的無符號 integer 類型,它大到足以包含任何 object ([expr.sizeof]) 的字節大小。
在第 3 段中,也沒有要求它們相同。
標准沒有要求。
請注意,當前的英特爾處理器有 48 位指針。
所以就我個人而言,我認為為std::size_t
設想一個 64 位unsigned
類型和為std::ptrdiff_t
設想一個 49 位有符號類型並不太牽強。 雖然這樣的計划實施起來會很頭疼。
更有趣的是,一旦芯片組發展為具有 64 位指針(我們離必要的還有一段距離),大概std::ptrdiff_t
必須至少為 65 位! 因此,我個人記住,有一天sizeof(std::ptrdiff_t)
可能大於sizeof(std::size_t)
。
在我的平台上...
std::size_t
和std::ptrdiff_t
具有相同的大小
這是如何合規的?
C 有(我相信 C++ 繼承 - 如果不讓我知道刪除)作為 UB 在§ J.2:
在
ptrdiff_t
(6.5.6) 類型的 object 中無法表示減去兩個指針的結果。”
這允許ptrdiff_t
的類型成為 unsigned size_t
的有符號對應物。
當這樣配對沒有填充時,
char a[PTRDIFF_MAX + (size_t)1]; // OK with enough memory in the location needed
size_t size_a = sizeof a; // OK
size_t diff0 = &a[sizeof a - 1] - &a[0]; // OK
ptrdiff_t diff1 = &a[sizeof a] - &a[0]; // UB
ptrdiff_t diff2 = %a[0] - &a[sizeof a]; // UB
故事的寓意:當數組元素計數超過PTRDIFF_MAX
時,指針減法(結果類型: ptrdiff_t
)可能會出現問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.