Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么strlen()返回64位整数?我错过什么了吗?_C++_Standards_64 Bit - Fatal编程技术网

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

C++ 为什么strlen()返回64位整数?我错过什么了吗?,c++,standards,64-bit,C++,Standards,64 Bit,编译64位应用程序时,为什么strlen()返回64位整数?我错过什么了吗 我知道strlen()返回一个size\u t类型,根据定义这不应该改变,但是。。。为什么strlen需要返回64位整数 该函数设计用于字符串。话虽如此: 程序员通常创建多GB或多TB的字符串吗? 如果他们这样做了,他们不需要比搜索空字符更好的方法来确定字符串长度吗 我认为这很荒谬,事实上,也许我们需要一个带回调的StrLenAsync()函数来处理在40TB字符串中搜索空值的超长过程。听起来很愚蠢?是的,well st

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

我知道strlen()返回一个size\u t类型,根据定义这不应该改变,但是。。。为什么strlen需要返回64位整数

该函数设计用于字符串。话虽如此:

程序员通常创建多GB或多TB的字符串吗? 如果他们这样做了,他们不需要比搜索空字符更好的方法来确定字符串长度吗

我认为这很荒谬,事实上,也许我们需要一个带回调的StrLenAsync()函数来处理在40TB字符串中搜索空值的超长过程。听起来很愚蠢?是的,well strlen()返回一个64位整数


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

在为64位目标编译时,大小\u t被定义为64位。这是有道理的,因为size_t用于所有类型对象的大小,而不仅仅是字符串。

在64位应用程序上,创建5GB字符串绝对是可能的

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

即使不需要它,也不值得改变strlen的规范,不使用大小,而不仅仅是将返回值设为4而不是8字节。

嗯,1)大小是一个typedef,随体系结构而变化;2)将最大的整数作为返回值是否有意义?为什么是32位?为什么不是16岁?在您的计算机上是64,因为这是可能的最大字符串长度。

strlen()
必须使用可以表示分配模型中最大对象大小的返回类型

您可以使用
std::string
。它的
size\u-type
等于分配器的
size\u-type
。因此,如果您要创建自己的分配器,那么
std::string::size()
甚至可以使用
char
作为返回类型


感谢评论中的评论
std::string
只是
std::basic_string
的特殊化。当然,您应该在自定义分配器中使用
std::basic\u string

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

         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。(Windows3.1和Macintosh数据模型都是LP32。)

这与是否有人真的会制造出这样大小的字符串无关。按照惯例,所有指示内存占用字节数的返回类型都是size\t。

我可以想到一些应用程序,其中4GB的字符串根本不够(计算生物学、计算机取证是两大类)。不要因为你没有这样做就认为其他人也没有这样做。

是什么让你认为大小不会因平台而改变?以零结尾的字符串很愚蠢,为什么要在意呢?;)@NTDLS:在64位平台上,返回64位整数没有实际开销,因为它适合于单个寄存器。(假设一个寄存器用于返回值,这在我所见过的大多数平台上都是如此)。不再在您的40TB字符串中搜索空值。这不是问题,因为我只在可以在3秒内执行无限循环的计算机上分配我的40TB字符串。完全理解,但是对于一个函数来说,它可能永远不会在最大32位无符号整数上看到返回值,这不是有很多开销吗?因为两个指针之间的差是精确的。strlen就是这样。这有点像是说32位的大小有16位的开销,因为大多数字符串都低于64k.:-)在64位机器上,大小为64位。在这样的机器上,没有开销,因为寄存器是64位的,并且返回值通常在寄存器中。将大小定义为32位实际上是一种浪费。对于两个指针之间的差异(可能是负数),使用
ptrdiff\u t
<代码>大小\u t用于非负面内容。在32位应用程序中也可以创建5GB字符串。它不能一次映射到32位地址空间,所以斯特伦必须在这方面有点聪明,但事实并非如此。有关详细信息,请参阅以下有趣的文章:strlen函数对指针进行操作,假设字符串位于连续内存中。32位指针不能表示内存中大于4G(减去O/S保留的任何空间)的字符串。虽然有几种方法可以表示比地址空间大的字符串,但由于strlen规范中的假设,它们与strlen无关。我希望这可能会有所帮助。我现在把一个非常大的C++代码库移植到64位,所以我现在就生活和呼吸这些东西。Yea,非常漂亮的图表。我保存了一个副本。您不能(在标准C++中)更改std::string的分配器:它是一个typedef,不是一个模板。你必须使用基本的字符串。哦,不,我完全理解。我只是说,您不想将4GB+字符数组传递给strlen()函数。你最好在建造它的时候跟踪它的长度。我们在计算机取证中不使用4GB字符串。那太傻了。你从来没有把整个硬盘编入索引以便以后检查?当一部手机从一个场景中被取走时呢?索引SD卡的内容要比反复读取SD卡的内容容易得多。如果您指的是使用strlen()查找4GB字符串的长度,那么是的,这很愚蠢。否则,我不认为我是那个在这里傻的人。。。