sizeof(T)能产生的最大值是多少?
What is the largest value sizeof(T) can yield?
一开始人们可能会想到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)。和其他的一样算术溢出,如果结果不适合所提供的空间,行为未定义。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 使用指针从C++中的数组中获取最大值
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 在二维数组中查找最小值和最大值?
- 整数溢出,最大值为 pow(10,19)
- 以C++递归方式查找向量中的最大值
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 我的 If Else 语句无法在向量 (C++) 中提供最大值
- 如何使用可变参数模板类使用模板元编程获得最大值
- C++不同的最小最大值实现
- C++中"长整"的确切最大值是多少?
- C++中Boost库的cpp_dec_foat的最大值是多少
- 我可以传递给 std::thread::sleep_for() 和 sleep_until() 的最大值是多少
- MaxLocksPerFile JET4.0注册表值的最大值是多少?
- sizeof(T)能产生的最大值是多少?
- C中的最大值和最小值是多少#定义函数
- m堆不同价值的硬币,你只能从顶部获得硬币.假设你能把n个硬币带回家,最大值是多少