【问题标题】:Why size_t is used for indexing / representing size of an array?为什么 size_t 用于索引/表示数组的大小?
【发布时间】:2020-04-30 20:19:28
【问题描述】:

根据C++ - should you size_t with a regular array?

§ 18.2 6 类型 size_t 是实现定义的无符号整数 足够大以包含任何对象的大小以字节为单位的类型。

我不明白为什么这可以保证类型size_t 足够大以用于数组索引或足够大以表示数组中的元素 的数量。

例如:

int array[1000];

for (size_t i = 0; i < 1000; ++i) {

}

这似乎与我无关,为什么“一个足够大的数字包含对象的字节大小”== 保证类型 size_t 足以容纳数组索引”。

【问题讨论】:

    标签: c++ size-t


    【解决方案1】:

    简单来说,平台支持的最大数组可以用size_t索引。

    考虑:

    int array[1000];
    
    for (uint8_t i; i < 1000; ++i) {}
    

    这显然是错误的,uint8 没有索引该数组的范围。 size_t 始终由标准保证。

    至于为什么是字节,使用sizeof array 给出字节大小。需要有一种类型保证能够表示结果。

    我想使用ptrdiff_t 来索引数组会更有技术意义,因为这就是数组索引的类型:*(array+index)。但这并不常见,我猜它看起来更丑,打字时间更长,可能更令人困惑。

    请注意,C++ 标准不对任何其他类型做出任何类似的保证。但是在大多数实际情况下,这个范围问题在一定程度上是理论上的,因为您可以确定 64 位整数也可以索引任何适合内存的内容。这对于传达意图更为重要。

    【讨论】:

    • 我可以看到它对传达意图有什么好处,但我仍然看不到能够以字节为单位表示最大大小意味着它也可以表示最大可能的索引。例如:如果对象的最大可能字节大小为 100,这意味着 size_t 类型最多为 100。这也意味着最大索引为 100?最大尺寸的数组是 100 个元素?但是数组元素的大小也不同吗? (double x[100] 的大小!= int x[100] 的大小)
    • @csguy 没有任何地方说size_t 不能表示整数值大于 大于对象的最大可能索引或大小(以字节为单位)。您在问题中的引用只是说它可以至少代表任何对象的大小(以字节为单位)。
    • @csguy 如果可能的最大对象是 100 字节,size_t 不需要高于 100。我认为您在这里忽略了要点:元素的大小始终大于或等于一个字节。
    • @csguy 你不能有小于 sizeof 1 的数组元素(可能相关,sizeof char 定义为 1,无论 char 在某些平台上有多少位)。所以数组的索引不能超过它的字节大小(当我们用“字节”表示与char相同时)。
    【解决方案2】:

    数组是一个对象。如果size_t 可以以字节为单位表示数组的大小,那么它肯定也可以表示其中的任何索引,因为单个元素至少有一个字节大小。

    语言不允许使用比这更大的数组。

    【讨论】:

    • 您能否详细说明“因为单个元素至少有一个字节大小。”
    • @csguy 字节是 C++ 中的基本存储单位。对象不能小于一个字节,并且数组的每个元素都是数组的非重叠子对象。
    • 在您下面的评论中,您纠正了我的理解,即 size_t “至少可以表示任何对象的大小(以字节为单位)”。这仍然让我感到困惑,为什么它暗示“它也可以肯定地代表它的任何索引”。 2 似乎与我无关,更何况 size_t 至少代表任何对象的大小(以字节为单位),而不是最多任何对象的大小(以字节为单位)
    • @csguy 数组中的元素个数总是小于或等于数组的大小(以字节为单位)。 (因为每个元素至少有一个字节大小。)因此,如果所有可能的数组大小(以字节为单位)都适合size_t,那么所有可能的索引也是如此(因为它们是前者的子范围)。我不确定如何更详细地表达。也许您可以为您看到的问题添加更详细的解释?
    • @csguy 一个对象可以占用的最小空间是 1 个字节。因此,数组的元素至少占用 1 个字节。因此,最大索引总是小于或等于数组的大小(以字节为单位)。
    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 2015-11-02
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多