在我的平台上(我想在大多数平台上) std::size_t
和 std::ptrdiff_t
具有相同的大小和相同的排列。有没有哪个平台不是这样的?简而言之:这是否是标准所要求的?
简而言之:这是标准所要求的吗?
没有,唯一的要求是来自 [support.type.layout]2 它就是这样。
ptrdiff_t类型是一个实现定义的有符号的整数类型 它可以保存一个数组对象中两个下标的差值,如[expr.add]中所述。
有 第四段
注意:建议实现为ptrdiff_t和size_t选择的类型,其整数转换等级不大于符号长int的类型,除非需要更大的大小来包含所有可能的值。- 尾注 ]
但注释是非规范性的,它只是一个建议,而不是一个要求。
std::size_t
被定义为
size_t类型是一个实现定义的无符号整数类型,它足够大,可以包含任何对象的字节大小([expr.sizeof])。
在 第三段 而且它也没有要求它们是相同的。
这不是标准所要求的。
请注意,目前这批英特尔处理器的引擎盖下都有48位指针。
所以我个人认为,设想一个64位的处理器并不太牵强。unsigned
对于 std::size_t
和一个49位签名的类型,用于 std::ptrdiff_t
. 虽然这样的方案实现起来会很麻烦。
更有趣的是,一旦芯片组发展到拥有64位指针(我们离这一目标还有一段距离),大概就会有 std::ptrdiff_t
至少要有65位! 因此,就我个人而言,我一直在想,有朝一日 sizeof(std::ptrdiff_t)
可能大于 sizeof(std::size_t)
.
在我的平台上...
std::size_t
和std::ptrdiff_t
一样大
这如何符合要求?
C有(我相信C++继承了--如果没有让我知道要删除),因为在§J.2中的UB。
减去两个指针的结果不能用一个类型的对象来表示。
ptrdiff_t
(6.5.6)."
这样就可以将该类型的 ptrdiff_t
的有符号对应的无符号的 size_t
. 当搭配成这样,没有填充物时。
char a[PTRDIFF_MAX + (size_t)1]; // OK with enough memory in the location needed
size_t size_a = sizeof a; // OK
size_t diff0 = &a[sizeof a - 1] - &a[0]; // OK
ptrdiff_t diff1 = &a[sizeof a] - &a[0]; // UB
ptrdiff_t diff2 = %a[0] - &a[sizeof a]; // UB
故事的寓意:指针减法的麻烦(结果类型。ptrdiff_t
) 可 当数组 元素数 超过 PTRDIFF_MAX
.