(T)可以产生的最大值大小是多少?

时间:2011-10-31 19:26:07

标签: c++ memory pointers sizeof size-t

起初人们可能会认为std::numeric_limits<size_t>::max(),但如果有一个巨大的对象,它还能提供一个一个接一个的指针吗?我猜不会。这是否意味着最大值sizeof(T)可以产生std::numeric_limits<size_t>::max()-1?我是对的,还是我错过了什么?

7 个答案:

答案 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)。和其他任何一样   算术溢出,如果结果不适合提供的空间,   行为未定义。