size_t的大小和对齐方式是否和ptrdiff_t一样?

问题描述 投票:1回答:1

在我的平台上(我想在大多数平台上) std::size_tstd::ptrdiff_t 具有相同的大小和相同的排列。有没有哪个平台不是这样的?简而言之:这是否是标准所要求的?

c++ standards size-t ptrdiff-t
1个回答
6
投票

简而言之:这是标准所要求的吗?

没有,唯一的要求是来自 [support.type.layout]2 它就是这样。

ptrdiff_t类型是一个实现定义的有符号的整数类型 它可以保存一个数组对象中两个下标的差值,如[expr.add]中所述。

第四段

注意:建议实现为ptrdiff_t和size_t选择的类型,其整数转换等级不大于符号长int的类型,除非需要更大的大小来包含所有可能的值。- 尾注 ]

但注释是非规范性的,它只是一个建议,而不是一个要求。


std::size_t 被定义为

size_t类型是一个实现定义的无符号整数类型,它足够大,可以包含任何对象的字节大小([expr.sizeof])。

第三段 而且它也没有要求它们是相同的。


3
投票

这不是标准所要求的。

请注意,目前这批英特尔处理器的引擎盖下都有48位指针。

所以我个人认为,设想一个64位的处理器并不太牵强。unsigned 对于 std::size_t 和一个49位签名的类型,用于 std::ptrdiff_t. 虽然这样的方案实现起来会很麻烦。

更有趣的是,一旦芯片组发展到拥有64位指针(我们离这一目标还有一段距离),大概就会有 std::ptrdiff_t 至少要有65位! 因此,就我个人而言,我一直在想,有朝一日 sizeof(std::ptrdiff_t) 可能大于 sizeof(std::size_t).


0
投票

在我的平台上... std::size_tstd::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.

© www.soinside.com 2019 - 2024. All rights reserved.