簡體   English   中英

為什么 strlen() 返回一個 64 位整數? 我錯過了什么嗎?

[英]Why does strlen() return a 64-bit integer? Am i missing something?

編譯 64 位應用程序時,為什么 strlen() 返回一個 64 位整數? 我錯過了什么嗎?

我知道 strlen() 返回一個 size_t 類型,根據定義這不應該改變,但是......為什么 strlen需要返回一個 64 位整數?

該函數旨在與字符​​串一起使用。 照這樣說:

程序員通常會創建多 GB 或多 TB 的字符串嗎? 如果他們這樣做了,難道他們不需要比搜索 NULL 字符更好的方法來確定字符串長度嗎?

我認為這很荒謬,事實上,也許我們需要一個帶有回調的 StrLenAsync() 函數來處理在 40TB 字符串中搜索 NULL 的超長過程。 聽起來很蠢? 是的,strlen() 返回一個 64 位整數!

當然,提議的 StrLenAsync() 函數是個笑話。

看起來,當為 64 位目標編譯時,size_t 被定義為 64 位。 這是有道理的,因為 size_t 用於各種對象的大小,而不僅僅是字符串。

在 64 位應用程序上,絕對可以創建 5GB 的字符串。

規范不是為了阻止你做愚蠢的事情。

即使不需要它,也不值得改變 strlen 的規范而不使用 size_t 只是為了使返回值 4 而不是 8 個字節。

這是一個圖表,顯示了最常見的數據模型中一些基本類型的大小:

         LP32 ILP32 LP64 LLP64 ILP64
char       8    8     8     8     8
short     16   16    16    16    16
int       16   32    32    32    64
long      32   32    64    32    64
long long 64   64    64    64    64
pointer   32   32    64    64    64
size_t    32   32    64    64    64

32 位 Windows 數據模型是 ILP32,64 位 Windows 數據模型是 LLP64。 (Windows 3.1 和 Macintosh 數據模型都是 LP32。)

我可以想到幾個應用程序,其中 4GB 的字符串根本不夠(計算生物學、計算機取證是兩個巨大的應用程序)。 不要因為你不這樣做而認為其他人也不這樣做。

這與是否有人會真正制作出那么大的字符串無關。 按照慣例,所有指示某些內容在內存中占用的字節數的返回類型都是 size_t。

嗯,1) size_t 是一個 typedef 並且隨體系結構而變化 2) 將最大整數作為返回值是否有意義? 為什么是 32 位? 為什么不是16? 您的機器上是 64,因為這是可能的最大字符串長度。

strlen()必須使用可以表示分配模型中最大對象大小的返回類型。

您可以使用std::string 它的size_type等於分配器的size_type 因此,如果您要創建自己的分配器,那么std::string::size()甚至可以使用char作為返回類型。

感謝評論中的評論。 std::string只是std::basic_string 當然,您應該將std::basic_string與自定義分配器一起使用。

暫無
暫無

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

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