2014-10-30 98 views
4

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

  • 的size_t
  • 我自己index_t這將是一個簽署 int或根據我的程序很長的符號int

優點或使用超過一個無符號的一個帶符號的整數衆多​​,如

for (index_t i = 0; i < v.size() - 1; ++i) 

作品像它是supposer至(與UNS無符號整數,當v的大小爲0時,這個循環變得瘋狂)

for (index_t i = v.size() - 1; i >= 0; --i) 

工作就像它應該和其他許多優點。在性能方面,它甚至似乎是一個更好一點的

a + 1 < b + 1 

可以降低到一個< b相符號整數(溢出是不確定的),而不是在無符號整數的情況。唯一的優點表現就是,a/= 2可以減少到無符號整數的移位操作,但是不帶有符號的整數。

我想知道爲什麼C++委員會決定使用unsigned整數size_t,因爲它似乎引入了很多痛苦和只有很少的優點。

+0

其他比你想象的,無符號類型倒計時指數當工作完全在做算術時,也。如果你在範圍內思考,這個結果會非常好,'我 2014-10-30 12:15:23

+0

@Gustedt:感謝有趣的鏈接。我試圖將主題放在事實而不是意見上。有些人幫助我考慮使用ptrdiff_t,這很有用。 – InsideLoop 2014-10-30 19:28:29

回答

2

對我來說,無符號大小總是最有意義的,因爲數組中不能有-32個元素,所以將大小/長度始終視爲有符號數量是非常可怕的。

你提到的角落案例可以編碼,你可以例如如果v在第一種情況下爲空(它看起來並不是所有常見的開始,遍歷除最後一個以外的所有元素?),則在輸入它之前中止循環。

+2

循環遍歷所有元素,但最後一個元素在很多示例中都很有用。我正在考慮一個冒泡排序或者通過矩陣的元素M(i,i + 1)(矩陣的主對角線之上的對角線)。我明白「它確實表達了一個消息,即整數是非負的」,但大多數人用int來通過C中的數組,並且對int感覺很好。 – InsideLoop 2014-10-30 10:50:28

+2

索引是一個數值,無符號整型與數值不一樣。 (例如'abs(i1 - i2)'不會給出兩個指數之間的差異。)理想情況下,指數是一個範圍類型,但C++沒有範圍類型。並且試圖用'unsigned'僞造它並沒有幫助,因爲它仍然使上部範圍不受控制。 C++中的無符號整型被設計用於一些非常特殊的用途,比如位操作或者當模運算是真正需要的時候。 – 2014-10-30 11:16:01

+0

@JamesKanze:問題是無符號類型有兩種用例(自然數和環一致mod 2^N),它們有不同的要求,但不是使用單獨的類型C使得無符號類型小於' int「作爲第一個,而大於」int「的則表現另一個。爲例如添加不同的類型'unumN_t'和'uwrapN_t',前者保證將其升級爲簽名類型,後者保證不會升級,可以使事情更加簡潔。 – supercat 2017-10-12 15:41:59

5

在 中使用無符號類型作爲索引或大小的動機,該標準基於僅與16位 機器相關的約束。對於C++中的任何整型,天然的類型爲 int,這就是應該使用的東西;正如你已經注意到的 ,試圖在C++ 中使用無符號類型作爲數值是充滿了問題的。如果您擔心 的尺寸太大以至於不適合int,ptrdiff_t 會是合適的;畢竟,這是減去指針或迭代器的結果類型。 (即 v.size()有不同的類型v.end() - v.begin()事實是 真的是在標準庫中的設計缺陷。)

+0

事實上,v.size()和v.end() - v.begin()對我來說也很奇怪。感謝歷史原因和16位機器的提示。 – InsideLoop 2014-10-30 10:56:15

+0

我終於決定使用我自己的稱爲index_t的類型,它將是一個有符號整數。我將主要使用int或ptrdiff_t。如果我想要在內存帶寬上輕鬆使用index_t,則int會更好,而當我想要非常大的數組時,ptrdiff_t會很有用。 – InsideLoop 2014-10-30 19:32:02

+1

但是使用簽名類型會使符號轉換和符號比較警告在每次將它們用於像標準庫容器(如std :: vector)(用於索引或與.size()進行比較)時觸發。你只是禁用這些警告,或者你每次發生static_cast?後者對我來說似乎非常乏味。 – 2015-03-03 22:08:07

相關問題