【发布时间】:2017-03-11 23:15:51
【问题描述】:
我很难理解 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 在这种情况下到底有什么用?它是如何让我们的代码更便携的?
【问题讨论】:
-
您确实意识到,不考虑源缓冲区和目标缓冲区的大小,您不能只复制任意数量的字节?
-
谁告诉你
memcpy(pobj1, pobj2, 1048575);可以正常工作? -
更便携和更不便携就是一切。没有保证在任何地方都能以完全相同的方式工作的可移植性水平,至少对于任何有用的非平凡程序来说都不是。使您的代码“只是”更具可移植性的东西并没有错。
-
如果您在 16 位机器上工作,可寻址内存不超过
65536字节。您将无法创建两个指针,每个指针都指向1048575的大小,更不用说使用memcpy()从一个复制到另一个了。如果您硬编码该长度,通常会出现编译错误,因为编译器可以识别出该值超出了size_t可以表示的值。 -
将较大的整数转换为
size_t不会出现编译错误。这是一个定义明确的操作(值以SIZE_MAX+1为模调整)。