sizeof(T)能产生的最大值是多少?

What is the largest value sizeof(T) can yield?

本文关键字:最大值 多少 sizeof      更新时间:2023-10-16

一开始人们可能会想到std::numeric_limits<size_t>::max(),但是如果有一个这么大的对象,它还能提供一个经过一次结束的指针吗?我想没有。这是否意味着sizeof(T)能产生的最大值是std::numeric_limits<size_t>::max()-1 ?我是对的,还是我错过了什么?

Q: sizeof(T)能产生的最大值是多少?

A: std::numeric_limits<size_t>::max()

显然,sizeof不能返回大于std::numeric_limits<size_t>::max()的值,因为它不适合。唯一的问题是,它能返回...::max()吗?

是的。这是一个有效的程序,它没有违反c++ 03标准的约束,它演示了一个实例证明。特别地,本程序不违反§5.3.3 [expr]中列出的任何约束。Sizeof],而不是§8.3.4 [dcl.array]:

#include <limits>
#include <iostream>
int main () {
 typedef char T[std::numeric_limits<size_t>::max()];
 std::cout << sizeof(T)<<"n";
}

如果std::numeric_limits<ptrdiff_t>::max() > std::numeric_limits<size_t>::max(),可以通过从一次过尾指针中减去指向该对象的指针来计算大小为std::numeric_limits<size_t>::max()的对象的大小。

如果sizeof(T*) > sizeof(size_t),你可以有足够多的不同的指针来寻址对象内的每个字节(例如,如果你有一个char数组),再加上一个用于1 -past-the-end。

因此,有可能编写一个实现,其中sizeof可以返回std::numeric_limits<size_t>::max(),并且您可以在其中获得指向大对象的1 -past-the-end的指针

定义不明确。但为了保持在标准的安全范围内,最大对象大小为std::numeric_limits<ptrdiff_t>::max()

这是因为当你减去两个指针时,你得到一个ptrdiff_t

是一个有符号整数类型

干杯,hth。

能够指向数组末尾以外的要求与size_t的范围无关。给定一个对象x, (&x)+1很可能是一个有效的指针,即使分隔两个指针的字节数不能用size_t表示。

您可能会认为要求意味着对象大小的上限是指针的最大范围减去对象的对齐方式。然而,我不相信标准在任何地方说这样的类型不能被定义;要实例化一个并且仍然保持一致性是不可能的。

如果这是一个测试,我会说(size_t) -1

sizeof()表达式产生size_t类型的值。源自C99标准6.5.3.4:

结果的值是实现定义的,它的类型是定义的无符号整型)是size_t,定义在stddef.h(和其他头)。

因此,sizeof()可以产生的最大值是SIZE_MAX。

你可以有一个标准兼容的编译器,允许对象大小导致指针算术溢出;然而,结果是不确定的。来自c++标准,5.7 [expr.add]:

当指向同一数组对象的两个指针相减时,结果是两个数组的下标之差元素。结果的类型是实现定义的signed积分类型;该类型应与定义为的类型相同<cstddef>报头中的std::ptrdiff_t(18.2)。和其他的一样算术溢出,如果结果不适合所提供的空间,行为未定义。