代码之家  ›  专栏  ›  技术社区  ›  NTDLS

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

  •  2
  • NTDLS  · 技术社区  · 17 年前

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

    我知道strlen()返回一个size_t类型,根据定义,这不应该改变,但是…为什么斯特伦 需要 返回64位整数?

    该函数设计用于字符串。这样说:

    程序员通常创建千兆字节或千兆字节的字符串吗? 如果是这样,他们是否需要比搜索空字符更好的方法来确定字符串长度?

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

    当然,所建议的strlenasync()函数是一个笑话。

    7 回复  |  直到 16 年前
        1
  •  18
  •   Steven Sudit    17 年前

    看起来,在为64位目标编译时,大小t被定义为64位。这是有意义的,因为大小t用于各种对象的大小,而不仅仅是字符串。

        2
  •  8
  •   Tim Sylvester    17 年前

    在64位应用程序中,绝对可以创建5GB字符串。

    规范并不是为了阻止你做傻事。

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

        3
  •  7
  •   Nick    17 年前

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

             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
    

    32位Windows数据模型为ILP32,64位Windows数据模型为LLP64。

        4
  •  3
  •   San Jacinto    17 年前

    我可以想到几个应用程序,其中一个4GB字符串是不够的(计算生物学,计算机取证是两个巨大的)。不要以为因为你不做别人也不做的事。

        5
  •  2
  •   Larry Gritz    17 年前

    这与是否有人会制作出这样大的字符串无关。按照惯例,指示内存中某个东西所占字节数的所有返回类型都是大小T。

        6
  •  1
  •   Tyler    17 年前

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

        7
  •  0
  •   Kirill V. Lyadvinsky    17 年前

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

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

    感谢评论中的评论。 STD::字符串 只是 std::basic_string . 当然你应该用 std::基本_字符串 使用自定义分配器。