簡體   English   中英

sizeof(size_t) 可以小於 sizeof(int) 嗎?

[英]Can sizeof(size_t) be less than sizeof(int)?

sizeof(size_t)可以小於sizeof(int)嗎?

C 和/或 C++ 標准是否保證使用unsigned int進行數組索引總是安全的?

是的, sizeof(size_t)原則上可以小於sizeof(int) 我不知道有任何實現是正確的,而且很可能沒有。 我可以想象一個具有 64 位int和 32 位size_t

但是用unsigned int索引數組是安全的——只要索引的值在數組長度規定的范圍內。 []運算符的參數只需要是一個整數。 它不會轉換為size_t 它是根據指針算術定義的,其中+運算符有一個參數是指針,另一個參數是任何整數類型。

如果unsigned intsize_t寬,那么超過SIZE_MAXunsigned int索引值幾乎肯定會導致問題,因為數組不是那么大。 在 C++14 及更高版本中,明確禁止定義大於SIZE_MAX字節的類型(3.9.2 [compound.types] 第 2 段)。 在早期版本的 C++ 和所有版本的 C 中,沒有明確禁止它,但任何理智的實現都不太可能允許它。

[C 答案]

sizeof(size_t)可以小於sizeof(int)嗎?

是的。 size_t的大小可以小於、大於或與int相同,因為它們的相對大小/范圍未在 C 中指定 - 只有它們的最小_MAX值: _MAX

IMO, sizeof(size_t) < sizeof(int)獨角獸 理論上的,但沒見過。

代碼可以使用以下內容來檢測此類野獸。

#include <limits.h>
#include <stddef.h>
#if SIZE_MAX < UINT_MAX
  #error Unexpected small size_t
#endif

C 和/或 C++ 標准是否保證使用unsigned int進行數組索引總是安全的?

在 C 中,沒有。

示例: 一個小數組只能容忍 [0 ... 2] 的索引 - 無論索引的類型如何 - 而不是unsigned的整個范圍。 一個巨大的數組可能是可索引的 [0 ... UINT_MAX*42ull ],因此unsigned不能表示所有有效索引。

size_t足夠寬以索引所有數組。

暫無
暫無

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

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