簡體   English   中英

數組索引的類型:有符號/無符號整數優勢

[英]Type for array indices: signed/unsigned integer avantages

在C ++中,數組索引的默認大小是size_t,在大多數x86-64平台上是64位無符號 64位整數。 我正在為我的高性能計算庫構建我自己的std :: vector類(其中一個主要原因是我希望這個類能夠獲取指針的所有權,std :: vector不會提供)。 對於數組索引的類型,我想要使用:

  • 為size_t
  • 我自己的index_t將是一個signed int或一個long signed int,具體取決於我的程序

優點或使用有符號整數優於無符號整數,例如

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.

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