簡體   English   中英

索引數組時我應該總是使用 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_tchar[N]uint8_t[N]int[N]等情況下
  • size_tstd::vectorstd::list
  • QListQVector情況下為int
  • 在位數組的情況下的任意精度整數 (aint)(如果位數組的size()方法返回 aint)
  • aint 在內存中壓縮數組的情況下(如果數組的size()方法返回 aint)
  • aint 在數組跨越多台機器的情況下(如果數組的size()方法返回 aint)
  • C++ 以外的其他語言:
    • intjava.util.Collection及其子類的情況下

總結:安全索引類型是size()方法返回的類型。

注意:如果size()方法返回無符號size_t ,則有符號intssize_t不是安全索引類型。 在 gcc 和 clang 的情況下,編譯器標志-Wsign-compare (由-Wall啟用)和-Wconversion可用於防止大多數這些情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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