【问题标题】:Using the sizeof operator with very large objects对非常大的对象使用 sizeof 运算符
【发布时间】:2014-12-07 23:57:23
【问题描述】:

根据第 135 页 K&R(以及 this 维基百科页面),sizeof 运算符可用于计算对象的大小,并以 size_t 类型的无符号整数形式返回以字节为单位的大小。由于无符号整数的最大值是 2^32,如果我要对字节大小大于 2^32 的对象调用 sizeof 会发生什么,比如大小为 2^34 字节的对象。 sizeof 会返回什么?有没有办法绕过这个大小限制?

【问题讨论】:

  • 请注意,无符号整数的最大值不限于2^32。但是你必须问问自己,这么大的对象如何在一个虚拟内存地址空间有限的系统中使用。
  • 你的 C 编译器是否支持 64 位编译,如果支持,那么你的 size_t 定义将支持大于 2^32。
  • 没有任何有效的方法来创建大于 size_t 的对象 - 这很容易解决您的问题。 (虽然,“无符号整数”与“无符号整数”不同。例如,“无符号短”和“无符号长长”也是“无符号整数”)
  • @nos size_t 的唯一要求是不小于 65535。
  • @icepack 为什么size_t的唯一要求是不小于65535?

标签: c sizeof


【解决方案1】:

我认为你读错了。

“无符号整数”并不意味着“类型unsigned int”。例如,它也可以是unsigned long long,它可以(很多)更大。此外,当然,没有要求或规范说 unsigned int 仅限于 32 位。

【讨论】:

  • 基本上sizeof的使用> unsigned int就是implementation defined
  • 请注意,它的类型必须是 size_t,而不是 unsigned int。因此,它的最大值由 SIZE_MAX 宏定义,要求至少为 65535 - 当然,这个最小值相当有限
【解决方案2】:

sizeof 将大小以字节为单位返回为size_t 类型的无符号整数

size_t 是无符号整数类型之一(unsigned intunsigned long longunsigned short 等)的别名。哪个特定的无符号整数类型是实现定义的。

size_t 保证能够在您的系统上存储对象的理论最大大小。因此,如果您的 size_t 是一个 32 位无符号整数,那么就不可能在您的系统上创建一个大于 2^32 字节的对象。相反,如果您可以创建大于 2^32 字节的对象,那么 size_t 必须大于 32 位无符号整数,大到足以存储您可以创建的任何对象的大小。

【讨论】:

  • "size_t 保证能够在您的系统上存储对象的理论最大大小"。你有参考吗?
  • “size_t 是无符号整数类型之一的别名”——这对于 C89 来说是正确的,但由于 C99 之类的 typedef size_t __size_t 是有效的,其中 __size_t 可能不同于任何其他整数类型。
  • @GrzegorzSzpetkowski en.cppreference.com/w/c/types/size_t 并且可以从size_tsizeof 的结果类型这一事实推断,并且sizeof 被指定为能够产生任何完整的大小非函数类型。
  • @mafso 在这种情况下,我认为__size_t 是“无符号整数类型之一”。
  • @Oktalist:同意。关于 Grzegorz 的观点:我认为有些极端情况并不清楚标准,例如size_t huge = SIZE_MAX; size_t too_huge = sizeof(char[2][huge]);。这应该做什么?它不能给出正确的大小,但必须编译(不是常量中的溢出)。否则,我同意,如果你真的有对象,size_t 可以保持它的大小。
猜你喜欢
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多