[英]Type for array indices: signed/unsigned integer avantages
在C ++中,數組索引的默認大小是size_t,在大多數x86-64平台上是64位無符號 64位整數。 我正在為我的高性能計算庫構建我自己的std :: vector類(其中一個主要原因是我希望這個類能夠獲取指針的所有權,std :: vector不會提供)。 對於數組索引的類型,我想要使用:
優點或使用有符號整數優於無符號整數,例如
for (index_t i = 0; i < v.size() - 1; ++i)
工作就像是支持(使用無符號整數,當v的大小為0時,這個循環會變得瘋狂)
for (index_t i = v.size() - 1; i >= 0; --i)
像它應該的工作,以及許多其他的優點。 在性能方面,它甚至看起來好一點
a + 1 < b + 1
可以減少為帶有符號整數的<b(溢出未定義),而不是無符號整數。 唯一的優勢表現似乎是a / = 2可以簡化為無符號整數的移位操作,但不能用帶符號的整數。
我想知道為什么C ++委員會決定對size_t使用無符號整數,因為它似乎引入了很多痛苦並且只有很少的優點。
在標准中使用無符號類型作為索引或大小的動機是基於僅與16位機器相關的約束。 C ++中任何整數類型的自然類型都是int
,這應該是應該使用的; 正如您所注意到的那樣,嘗試在C ++中使用無符號類型作為數值充滿了問題。 如果你擔心尺寸太大而不適合int
,那么ptrdiff_t
是合適的; 畢竟,這是指針或迭代器的減法結果的類型。 (事實上, v.size()
的類型與v.end() - v.begin()
不同,這實際上是標准庫中的一個設計缺陷。)
對我來說,無符號大小總是最有意義,因為在數組中不能有-32個元素,將大小/長度一直視為有符號數量是非常可怕的。
你提到的極端情況可以被編碼,你可以例如在輸入之前中止循環,如果v
對於第一種情況是空的(開始時看起來並不常見,迭代除了最后一個之外的所有元素?)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.