"size_t"使代码可移植,还是只是'more'可移植?

Does "size_t" make code portable, or just 'more' portable?

本文关键字:可移植 more size 代码      更新时间:2023-10-16

我很难理解c++ std::size_t数据类型的用处。我意识到这种数据类型是平台相关的,并且应该是为了使代码更具可移植性。然而,这似乎并不能解决所有的问题。

举个例子,我在一台32位整型的机器上工作。假设我决定为这台机器写一个c风格的函数,它只是将字节从一个对象复制到另一个对象。在这个函数内部,memcpy函数用于将数据从object2写入object1。我选了一个任意大的数字。

void writeBytes(obj *pobj1, obj *pobj2) 
{
    memcpy(pobj1, pobj2, 1048575);
}

这段代码应该(希望)编译得很好。因为memcpy在它的声明中使用了size_t,而且这个平台上的size_t应该是32位,所以1048575这个数字应该可以正常工作。

但是现在假设我决定将这个函数移植到一台16位整型的机器上。现在memcpy函数将size_t解释为大小为16。在这种情况下,1048575超过了声明memcpy所允许的值。代码将无法编译。

那么我的问题是:size_t在这种情况下到底有多大用处?它如何使我们的代码更具可移植性?

size_t能够容纳您可以创建的最大对象的大小。它不需要是你的平台最大的本机整数类型。

对于您的示例,如果您的平台允许1048575字节的对象,那么无论本机整数是16位还是32位,您的代码都可以工作。或者反过来——如果1048575不适合size_t,你永远不可能创建一个像memcpy那么大的对象。

size_t与其他整型一样容易受到溢出和下流规则的影响。它只是无符号积分的类型定义。它的目的不是阻止您分配或转换超出其范围的值。它定义了一个标准类型,将:

"存储任何类型的理论上可能的对象的最大大小(包括数组)。"

如果您关心最大大小,请使用

std::numeric_limits<std::size_t>::max()

并据此做出决定

我认为size_t使(不仅仅是你的)代码更具可读性和一致性,不一定更可移植。但是,它将帮助移植它。

想象一些函数使用int, short, long, unsigned, unsigned short,…的混合使用

当一个处理size的函数调用另一个也需要size参数的函数时,当一个size_t适合所有(或至少适合大多数,如read()的结果)时,这是非常有用的。