簡體   English   中英

size_t 的大小和 alignment 是否與 ptrdiff_t 相同?

[英]Does size_t have the same size and alignment as ptrdiff_t?

在我的平台上(我認為在大多數平台上) std::size_tstd::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_tstd::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.

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