繁体   English   中英

size_t ptrdiff_t和地址空间

[英]size_t ptrdiff_t and address space

在我的系统上, ptrdiff_tsize_t都是64位

我想澄清两件事:

  • 我相信由于地址空间的限制,没有数组可能与size_t一样大。 这是真的?

  • 如果是,那么,是否可以保证ptrdiff_t能够保存最大大小数组中任何指针的减法结果?

不,没有这样的保证。 例如,请参见: https//en.cppreference.com/w/cpp/types/ptrdiff_t

如果数组太大(大于PTRDIFF_MAX元素,但小于SIZE_MAX字节),则两个指针之间的差异可能无法表示为std :: ptrdiff_t,则减去两个这样的指针的结果是未定义的。

大多数实现人为地限制最大数组大小,以确保指向同一数组的两个指针之间的差异适合ptrdiff_t 因此,很可能在您的平台上,允许的最大数组大小约为SIZE_MAX / 2 (试一试)。 这不是“地址空间限制”,它只是您的实施内部强制执行的限制。 在此限制下,合法指针减法(“合法”=指向同一数组的两个指针)不会溢出。

虽然语言规范不要求。 实现不需要以这种方式限制它们的数组大小,这意味着语言规范允许看似合法的指针减法溢出并产生未定义的行为。 但是大多数实现都喜欢通过限制它们的数组大小来抵御这种情况。

有关详细信息,请参阅此处的“三个选项”: 为什么数组的最大大小“太大”?

来自[support.types.layout] / 3

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

所以你可以保证size_t可以保存你可以拥有的最大数组的大小。

ptrdiff_t遗憾的是不能保证。 来自[support.types.layout] / 2

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

哪个没关系,但我们有[expr.add] / 5

当减去指向同一数组对象的元素的两个指针时,结果的类型是实现定义的有符号整数类型; 此类型应与标题(21.2)中定义为std :: ptrdiff_t的类型相同。 如果表达式P和Q分别指向相同阵列对象x的元素x [i]和x [j],则表达式P-Q具有值i-j; 否则,行为未定义。 [注意:如果值i-j不在std :: ptrdiff_t类型的可表示值范围内,则行为未定义。 - 尾注]

哪个说ptrdiff_t可能不够大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM