![](/img/trans.png)
[英]When should I use vector<int>::size_type instead of size_t?
[英]Should I always use size_t when indexing arrays?
即使數組的大小不足以超過 int 的大小,在索引數組時是否需要始終使用size_t
?
這不是關於何時應該使用size_t
。 我只是想知道,例如,一個程序是否有 2GB 的可用內存(所有這些字段都可以由 int32 索引)但是這個內存(虛擬內存)分配給了計算機的 14GB - 16GB 的“字段”內存。
如果我在這種情況下使用int32
而不是size_t
(或unsigned long int
)索引內存時它是否總是失敗?
也許問題更多的是關於虛擬內存而不是指針。
size_t
是一個無符號整數,能夠容納您可以分配的最大對象的大小。 它對索引很有用,因為這意味着它可以索引到您可以分配的最大數組。
這並不意味着它是索引所必需的,甚至是必須推薦的。 您可以使用任何足夠大的整數類型來索引數組。 int_fast32_t
可能更快, uint_least16_t
在結構中可能更小,依此類推。 了解您的數據,您就可以做出明智的選擇。
您應該考慮的一個問題是,在某些平台上,使用簽名索引可能需要額外的符號擴展指令。 例如,這里是 x86:
// movzx eax, BYTE PTR [rcx+rdx]
// ret
char get_index(char *ptr, unsigned idx)
{
return ptr[idx];
}
// ; sign extending idx from 32 bits to 64 bits with movsx here.
// movsx rdx, edx
// movzx eax, BYTE PTR [rcx+rdx]
// ret
char get_index(char *ptr, int idx)
{
return ptr[idx];
}
虛擬內存不在 C 或 C++ 的范圍內。 從他們的角度來看,您只需對內存進行索引,這取決於您的平台使其工作。 實際上,您的應用程序僅使用虛擬地址; 您的 CPU/OS 在幕后將虛擬地址轉換為物理地址。 這不是你需要擔心的事情。
為了避免程序失敗,程序員應該始終使用至少與size()
方法返回的類型一樣大的索引類型。 這確保索引永遠不會溢出數組的任何可能大小。 數組的實現通常確保其運行時大小永遠不會溢出size()
方法返回的類型。 這意味着索引類型應該是:
size_t
在char[N]
、 uint8_t[N]
、 int[N]
等情況下size_t
在std::vector
和std::list
QList
和QVector
情況下為int
size()
方法返回 aint)size()
方法返回 aint)size()
方法返回 aint)int
在java.util.Collection
及其子類的情況下總結:安全索引類型是size()
方法返回的類型。
注意:如果size()
方法返回無符號size_t
,則有符號int
和ssize_t
不是安全索引類型。 在 gcc 和 clang 的情況下,編譯器標志-Wsign-compare
(由-Wall
啟用)和-Wconversion
可用於防止大多數這些情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.