我很难理解C ++ std :: size_t数据类型的用处。我意识到这种数据类型是依赖于平台的,并且应该意味着使代码更具可移植性。但是,它似乎并没有解决所有问题。
比如说我正在使用32位int的机器上工作。让我们说我决定编写这台机器的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究竟有用吗?它是如何使我们的代码更便携的?
答案 0 :(得分:7)
size_t
能够保存您可以创建的最大对象的大小。它不一定是您平台上最大的本机整数类型。
根据您的示例,如果您的平台允许1048575字节对象,则无论本机整数是16位还是32位,您的代码都可以正常工作。或者反过来 - 如果1048575不适合size_t
,你永远不可能创建一个大到memcpy
的对象。
答案 1 :(得分:1)
size_t
容易受到与任何其他整数类型相同的上溢和下溢规则的影响。它只是无符号积分的typedef。其目的不是阻止您分配或转换超出其范围的值。它定义了一个标准类型:
"存储任何类型的理论上可能的对象的最大大小 (包括数组)。"
如果您关心最大尺寸,请使用
std::numeric_limits<std::size_t>::max()
并做出决定。
答案 2 :(得分:0)
我认为size_t
使(不仅是您的)代码更具可读性和一致性,不一定更具可移植性。
但是,它将帮助进行移植。
想象一下,某些大小的函数使用int
,short
,long
,unsigned
,unsigned short
,...
当一个处理大小的函数也调用另一个需要大小参数的函数时,当一个size_t
适合所有(或至少适合read()
的结果)时,这将非常有帮助。