【问题标题】:When to use size_t vs uint32_t?何时使用 size_t 与 uint32_t?
【发布时间】:2015-02-23 22:00:47
【问题描述】:

何时使用 size_t 与 uint32_t?我在一个项目中看到了一个方法,它接收一个名为length(类型为uint32_t)的参数来表示要处理的字节数据的长度,该方法用于计算接收到的字节数据的CRC。参数的类型后来被重构为 size_t。在这种情况下使用 size_t 是否有技术优势?

例如

- (uint16_t)calculateCRC16FromBytes:(unsigned char *)bytes length:(uint32_t)length;

- (uint16_t)calculateCRC16FromBytes:(unsigned char *)bytes length:(size_t)length;

【问题讨论】:

  • AFAICS,没有有意义的理由这样做。给定的 CRC 被定义为在特定的字长下工作,而这正是 uint32_t 的含义。从语义的角度来看,size_t 不对应于明确的大小。
  • 我猜这是因为您希望 size_t 成为平台可以原生支持的最大数据类型(即,您希望在保持快速的同时拥有较大的范围)。例如。在 32 位系统上,您希望它是 32 位,而在 64 位系统上,您希望它是 64 位,但您不希望 size_t 是 32 位上的 64 位类型系统(或 16 位系统上的 uint32_t)。否则,它可能只是一个很好的指标,表明该参数表示某种尺寸数量。我不知道他们为什么特别选择在这里使用size_t
  • 谢谢大家 - 我在问题中添加了更多细节。
  • @tangrs 所以根据你的理由,使用 size_t 比 NSUInteger 更好吗?它们在技术上是否相同?
  • 好的,加上上下文,这更有意义。 size_t 没有用于 CRC 数学本身,它只是循环绑定。这是完全合理的。

标签: objective-c c size-t uint32


【解决方案1】:

根据 C 规范

size_t ... 是 sizeof 结果的无符号整数类型 运营商

因此,任何保存sizeof 操作结果的变量都应声明为size_t。由于示例原型中的length 参数可能是sizeof 操作的结果,因此将其声明为size_t 是合适的。

例如

unsigned char array[2000] = { 1, 2, 3 /* ... */ };
uint16_t result = [self calculateCRC16FromBytes:array length:sizeof(array)];

您可能会争辩说,对长度参数的重构是毫无意义的迂腐,因为除非:
a) size_t 大于 32 位
b) 数组大小大于4GB

【讨论】:

  • 但是:您可以在size_t 为 16 位或 64 位的系统上运行。它的大小是实现定义的。 uint32_t,OTOH,保证(?)32 位宽。 CRC 具有指定的大小。在 16 位 size_t 上运行 32 位 CRC 会导致问题。
  • @ColeJohnson 是也不是。首先请注意,更改的是length 参数。您可以将 CRC 应用于任何 length 数据。所以唯一的问题是输入的length是否应该始终指定为32位数字,或者应该指定为size_t。如果 a) size_t 为 16 位 b) 缓冲区大于 64KB,您可能会争辩说 size_t 将不起作用。但是,这假设有运行 Objective-C 代码的 16 位系统。
猜你喜欢
  • 2021-05-06
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 2020-12-18
  • 2012-07-21
  • 1970-01-01
相关资源
最近更新 更多