簡體   English   中英

為了迭代數組我們應該使用size_t還是ptrdiff_t?

[英]For iterating though an array should we be using size_t or ptrdiff_t?

在這篇由Andrey Karpov撰寫的題為“關於size_tptrdiff_t ”的博客文章中,他展示了一個例子,

for (ptrdiff_t i = 0; i < n; i++)
  a[i] = 0;

但是,我不確定這是否正確,似乎應該如此

for (size_t i = 0; i < n; i++)
  a[i] = 0;

這個對嗎?

我知道我們也應該使用類似memset東西,但讓我們完全避免這種情況。 我只問這種類型

博客文章中 ,我認為你應該總是避免分配大於PTRDIFF_MAX (*)的內存塊,因為這樣做會使得像Clang和GCC這樣的編譯器產生無意義的代碼,即使你沒有以某種方式減去指向該塊的指針導致結果溢出。

(*)即使malloc成功傳遞的值大於PTRDIFF_MAX 問題的關鍵在於GCC和Clang只生成與這樣的malloc鏈接時行為正確的代碼,但Glibc提供了一個不實現此限制的malloc函數。

如果您遵循該約束(我鼓勵您:這是博客文章的消息),那么這兩種類型都是同樣正確的。

這就是說,因為只需要表示正偏移量,所以size_t將是您示例中的自然選擇。

使用ptrdiff_t是可以的,因為a[i]被翻譯為*(a + i)

如果你拿兩個指針p1p2 ,鼓勵你使用:

ptrdiff_t d = p2 - p1; // Assuming p2 - p1 is valid.

鑒於此, p2 == p1 + d ,即<ptr type> + ptrdiff_t是有效表達式。 ptrdiff_tsize_t是否更好,因為索引類型是團隊中使用的意見和/或編碼樣式的問題。

OP的問題的答案是肯定的,size_t最適合示例代碼,其中沒有相互減去指針值,並且沒有關於malloc行為的交叉編譯器/庫兼容性問題。 無論堆管理器的區別如何,在C中,數組的長度可以是SIZE_MAX字節,並且需要size_t來表示它。 標准中沒有任何內容要求堆管理器能夠在堆中分配所有進程內存空間,或者為此分配最多SIZE_MAX字節,但是數組的長度可以是SIZE_MAX ,因此size_t是合適的。

即使n被簽名,使用ptrdiff_t for i也無濟於事,因為初始i < n測試無論如何都會失敗,如果n為負,因為i初始化為零。 i中沒有size_t索引無法訪問的索引。 需要ptrdiff_t的唯一地方就是從另一個指針值中減去一個指針值,而OP並沒有詢問這個值。

暫無
暫無

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

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