为什么strlen()返回64位整数?我错过了什么吗?

NTD*_*DLS 2 c++ 64-bit standards

编译64位应用程序时,为什么strlen()返回64位整数?我错过了什么吗?

我理解strlen()返回一个size_t类型,根据定义,这不应该改变,但是......为什么strlen 需要返回一个64位整数?

该函数旨在与字符​​串一起使用.照这样说:

程序员通常会创建数千兆字节或多字节的字符串吗?如果他们这样做了,他们是否需要更好的方法来确定字符串长度而不是搜索NULL字符?

我认为这很荒谬,事实上,我们可能需要一个带回调的StrLenAsync()函数来处理在40TB字符串中搜索NULL的超长进程.听起来很愚蠢?是的,strlen()返回一个64位整数!

当然,提出的StrLenAsync()函数是一个笑话.

Ste*_*dit 18

看起来,当编译64位目标时,size_t被定义为64位.这是有道理的,因为size_t用于各种对象的大小,而不仅仅是字符串.

  • 这有点像说32位size_t有16位开销,因为大多数字符串都低于64k.:-) (16认同)
  • 在64位计算机上,size_t是64位.在这样的机器上,没有开销,因为寄存器是64位,通常返回值在寄存器中.将size_t定义为32位实际上是浪费. (9认同)
  • 对于两个指针(可以是负数)之间的差异,使用`ptrdiff_t`.`size_t`用于非负面事物. (4认同)
  • 两个指针之间的区别是准确的.而strlen就是这样. (2认同)

Tim*_*ter 8

在64位应用程序上,绝对可以创建一个5GB的字符串.

该规范并不是为了防止你做愚蠢的事情.

即使不需要,也不值得将strlen的规范改为使用size_t来使返回值4而不是8字节.

  • strlen函数对指针进行操作,假设该字符串在连续的内存中.32位指针不能表示大于4G的字符串(减去O/S保留的任何空间)*在内存中*.虽然有几种方法可以表示大于地址空间的字符串,但由于其规范中内置的假设,它们与strlen无关. (3认同)
  • 在32位应用程序中也可以创建一个5GB的字符串.它不能一次映射到32位地址空间,因此strlen必须对此有点聪明,但事实并非如此.有关详细信息,请参阅以下有趣的文章:http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx (2认同)

Nic*_*ick 7

这是一个图表,显示了最常见数据模型中一些基本类型的大小:

         ILP32 LP64 LLP64 ILP64
char       8     8     8     8
short     16    16    16    16
int       32    32    32    64
long      32    64    32    64
long long 64    64    64    64
pointer   32    64    64    64
size_t    32    64    64    64
Run Code Online (Sandbox Code Playgroud)

32位Windows数据模型是ILP32,64位Windows数据模型是LLP64.