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

C++ sizeof(T)能产生的最大值是多少?,c++,memory,pointers,sizeof,size-t,C++,Memory,Pointers,Sizeof,Size T,起初,人们可能会认为std::numeric_limits::max(),但如果有一个如此巨大的对象,它还能提供一个超过结束指针的对象吗?我想不是。这是否意味着sizeof(T)可能产生的最大值是std::numeric\u limits::max()-1?我是对的,还是遗漏了什么?如果这是一个测试,我会说(size\u t)-1一个sizeof()表达式产生一个size\u t类型的值。根据C99标准6.5.3.4: 结果的值是实现定义的,其类型是 无符号整数类型)是在stddef.h(和其他

起初,人们可能会认为std::numeric_limits::max(),但如果有一个如此巨大的对象,它还能提供一个超过结束指针的对象吗?我想不是。这是否意味着
sizeof(T)
可能产生的最大值是
std::numeric\u limits::max()-1
?我是对的,还是遗漏了什么?

如果这是一个测试,我会说
(size\u t)-1
一个
sizeof()
表达式产生一个
size\u t
类型的值。根据C99标准6.5.3.4:

结果的值是实现定义的,其类型是 无符号整数类型)是在stddef.h(和其他)中定义的大小 标题)

因此,sizeof()可以产生的最大值是SIZE\u MAX

问:sizeof(T)能产生的最大值是什么

答:
std::numeric\u limits::max()

显然,sizeof不能返回大于std::numeric\u limits::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";
}
#包括
#包括
int main(){
typedef char T[std::numeric_limits::max()];

std::cout它的定义并不准确。但为了保持标准的安全限制,最大对象大小是
std::numeric\u limits::max()

这是因为当你减去两个指针时,你会得到一个
ptrdiff\u t

它是有符号整数类型


cheers&hth.,

如果
std::numeric\u limits::max()>std::numeric\u limits::max()
您可以通过从结束指针上减去指向它的指针来计算大小为
std::numeric\u limits::max()
的对象的大小

如果
sizeof(T*)>sizeof(size\u T)
您可以有足够多的不同指针来寻址该对象中的每个字节(例如,如果您有一个字符数组),再加上一个指针表示超过末尾的一个字节


因此,可以编写一个实现,其中
sizeof
可以返回
std::numeric\u limits::max()< /代码>,在那里你可以得到一个对象的一个大对象的结束。< /p> < p>你可以有一个标准兼容编译器,允许对象的大小导致指针运算溢出,但是结果是未定义的。从C++标准,5.7 [ Exp.Ad]:

当两个指向同一数组对象元素的指针相减时, 结果是两个数组的下标不同 元素。结果的类型是一个已签名的实现 整体式;该类型应与定义为的类型相同
标题(18.2)中的std::ptrdiff\u t
。与任何其他 算术溢出,如果结果不符合提供的空间, 该行为未定义


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


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

对象是否需要提供一个onE-PASE-TIMEVER?@阿纳尔:根据C++标准,是的,因为就指针算法而言,一个对象可以被看作是一个大小为1的数组。如果你想要的话,我可以查到确切的措辞。@迈克:错误,5.7×1表示<代码>。对于这些运算符的指针,指向非数组对象的指针的行为与指针的指针相同。长度为1的数组的第一个元素,其元素类型为对象的类型。
我没有看到对象之间的相关性
std::numeric\u limits::max()
large,系统无法提供一个超过结束指针的值。@Dennis:…因为size\u t和intptr\u t是不同的东西,这就是
std::numeric\u limits::max()
。这是
size\u t
中可以存储的最大值。这并不意味着
sizeof
使用了
size\u t
的所有值。你真的完整阅读了这个问题吗?弗雷德讨论了他为什么认为这可能是错误的。你怎么能在提问后10分钟以上给出一个与你的疑问相矛盾的答案“我甚至没有争论过它们吗?+1,尽管问题仍然是超过结束指针的那一个会有什么值。嗯,它会在我的计算机上打印
4294967295
,所以我想我错了。@sbi:公平地说,Rob用一个反例证明了我的错误。关于“最大值
sizeof(t)
可以返回”之间的区别,有很大的变化。”和这里的“实际可以实例化的最大变量”(甚至忽略任何给定计算机的实际内存容量);-)遗憾的是,您可以拥有一个大于
std::numeric_limits::max()
的数组。如果在此数组中减去两个相距太远的指针,则行为未定义,请参阅[expr.add]/6.@avakar:我会被诅咒的!很好的发现。
与任何其他算术溢出一样,如果结果不符合提供的空间,行为是未定义的。
如果实现目标是一个具有分段地址的平台,
sizeof(T*)>sizeof(size\u T)
可能很容易成为真的。我怀疑有这样的实现[where
sizeof
可以返回
std::numeric\u limits::max()
]”。g++就是这样一种实现。