起初人们可能会认为std::numeric_limits<size_t>::max()
,但如果有一个巨大的对象,它还能提供一个一个接一个的指针吗?我猜不会。这是否意味着最大值sizeof(T)
可以产生std::numeric_limits<size_t>::max()-1
?我是对的,还是我错过了什么?
答案 0 :(得分:3)
问:(T)可以产生的最大值size是多少?
答: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";
}
答案 1 :(得分:3)
如果std::numeric_limits<ptrdiff_t>::max() > std::numeric_limits<size_t>::max()
你可以通过从一个接一个的指针中减去指向它的指针来计算大小为std::numeric_limits<size_t>::max()
的对象的大小。
如果sizeof(T*) > sizeof(size_t)
你可以有足够的不同指针来处理该对象中的每个单字节(例如,如果你有一个char数组),加上一个用于一个接一个的结尾。< / p>
因此,可以编写一个实现,其中sizeof
可以返回std::numeric_limits<size_t>::max()
,并且您可以在其中获取指向大对象的一端的指针。
答案 2 :(得分:2)
它的定义并不完全明确。但要保持在标准的安全范围内,最大对象大小为std::numeric_limits<ptrdiff_t>::max()
那是因为当你减去两个指针时,你得到一个ptrdiff_t
是有符号整数类型
欢呼&amp;第h。,答案 3 :(得分:1)
能够指出超出数组末尾的要求与size_t
的范围无关。给定一个对象x
,即使分隔两个指针的字节数不能由(&x)+1
表示,size_t
也很可能成为有效指针。
您可能会认为 要求意味着最大指针范围的对象大小的上限减去对象的对齐。但是,我不相信标准说任何地方都无法定义这种类型;实例化一个并且仍然保持一致是不可能的。
答案 4 :(得分:0)
如果这是一个测试,我会说(size_t) -1
答案 5 :(得分:0)
sizeof()
表达式生成类型为size_t
的值。从C99标准6.5.3.4开始:
结果的值是实现定义的,它的类型(一个 无符号整数类型)是size_t,在stddef.h中定义(和其他 头)。
因此,sizeof()可以产生的最大值是SIZE_MAX。
答案 6 :(得分:0)
您可以使用符合标准的编译器,该编译器允许导致指针算法溢出的对象大小;但是,结果是不确定的。从C ++标准,5.7 [expr.add]:
当减去指向同一数组对象的元素的两个指针时, 结果是两个数组的下标的差异 元素。结果的类型是实现定义的签名 积分型;此类型应与定义的类型相同
std::ptrdiff_t
标题中的<cstddef>
(18.2)。和其他任何一样 算术溢出,如果结果不适合提供的空间, 行为未定义。