※ 引述《bjiyxo (若自礌)》之銘言:
: 如題
: 因為曾聽過不同型態的變數做運算的時候
: 會增加電腦的負擔
: 而索引值又常常用到
: 所以好奇想問
: 索引值的預設型態是什麼?
→ uranusjr: 其實只要是整數形態都差不多, 如果你堅持一定要挑一個, 10/02 18:52
→ uranusjr: 就用 ptrdiff_t 吧 10/02 18:52
→ wowslr: container 用裡面的 size_type, 不然就 size_t? 10/02 19:44
→ Killercat: STL裡面(或者說C++ Libs)都用size_t 10/03 15:52
→ Killercat: C就沒有一定標準了 typedef/#define滿天飛的.... 10/03 15:53
→ Killercat: 另外 size_t通常是long或者uint64(兩者大小一樣) 10/03 15:55
我想說一下我選 ptrdiff_t 的原因
首先, 根據標準, subscripting 只是指標運算 + dereferencing 的 syntax sugar
也就是對於一個陣列 a 與整數 i(注意這邊都還完全不考慮形態)
a[i]
完全對等於
*(a + i)
這有兩個意義:
1. Subscript 使用的型別應該與 pointer 型別相同
其實我猜 compiler 都會最佳化, 不過如果完全照字面解答原 po 的問題, 那麼
我們要找的應該是 pointer 運算時使用的型別。
2. Subscript 值可以是負的
由於負方向的指標運算完全合法, negative subscript(e.g. a[-1])完全符合
標準, 即使並不直觀。
所以 size_t 並不符合。主要因為它是無號整數, 不過其實也沒人說過它和指標有什
麼關聯。我們要找的是用在指標運算, 且有號的型別:
http://goo.gl/1Xpf6x (www.gnu.org)
Data Type: ptrdiff_t
This is the signed integer type of the result of subtracting two pointers.
For example, with the declaration char *p1, *p2;, the expression p2 - p1
is of type ptrdiff_t. This will probably be one of the standard signed
integer types (short int, int or long int), but might be a nonstandard
type that exists only for this purpose.
延續前面的例子, 假設 a 是 foo 的 array, 且索引取值後的結果是 b:
b = a [ i ]
↑ ↑ ↑
foo foo[] ??
b = *( a + i )
↑ ↑ ↑
foo foo[] ??
令 *c = b, 則
c = a + i
↑ ↑ ↑
foo* foo[] ??
i = c - a 讓 a decay 為指標
↑ ↑ ↑
?? foo* foo*
根據上面的規範, i 的型別顯然應該是 ptrdiff_t。