Con*_*ous 6 c++ size pointers memory-address
在我的系统都ptrdiff_t和size_t是64位.
我想澄清两件事:
我相信没有阵列可以像size_t地址空间限制一样大.这是真的?
如果是,那么,是否有保证ptrdiff_t能够保存最大尺寸数组中任何指针的减法结果?
大多数实现人为地限制最大数组大小,以确保指向同一数组的两个指针之间的差异适合ptrdiff_t. 因此,在您的平台上,允许的最大数组大小很可能约为SIZE_MAX / 2(尝试一下)。这不是“地址空间限制”,它只是您的实现内部强制执行的限制。在此限制下,合法指针减法(“合法”=两个指针指向同一数组)不会溢出。
但语言规范并不要求这样做。实现不需要以这种方式限制其数组大小,这意味着语言规范允许看似合法的指针减法溢出并产生未定义的行为。但大多数实现更愿意通过限制数组大小来防御这种情况。
有关更多详细信息,请参阅此处的“三个选项”:为什么数组的最大大小“太大”?