最初は思うかもしれませんがstd::numeric_limits<size_t>::max()
、それだけの巨大なオブジェクトがあったとしても、それでも1つ過去のポインタを提供できるでしょうか。私はそうは思わない。それは、最大値sizeof(T)
が得られる可能性があることを意味しますstd::numeric_limits<size_t>::max()-1
か?私は正しいですか、それとも何かが足りませんか?
7 に答える
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()
へのポインターを1つの過去のポインターから減算することによって計算できる場合。
sizeof(T*) > sizeof(size_t)
そのオブジェクト内のすべてのバイトをアドレス指定するのに十分な個別のポインター(たとえば、charの配列がある場合)に加えて、過去1バイト用のポインターを使用できる場合。
したがって、sizeof
を返すstd::numeric_limits<size_t>::max()
ことができ、その大きなオブジェクトの最後から1つへのポインタを取得できる実装を作成することができます。
正確に定義されているわけではありません。ただし、標準の安全な制限内にとどまるために、最大オブジェクトサイズはstd::numeric_limits<ptrdiff_t>::max()
これは、2つのポインターを引くと、ptrdiff_t
これは符号付き整数型です
乾杯&hth。、
配列の終わりを超えて指すことができるという要件は、の範囲とは何の関係もありませんsize_t
。オブジェクトが与えられた場合、2つのポインターを区切るバイト数をで表すことができない場合でも、有効なポインターになるx
可能性は十分にあります。(&x)+1
size_t
この要件は、オブジェクトの配置を差し引いた、ポインタの最大範囲のオブジェクトサイズの上限を意味すると主張することができます。しかし、私は、そのようなタイプを定義できないと標準がどこにも言っているとは思いません。1つをインスタンス化して、それでも準拠を維持することは不可能です。
これがテストだったら、私は言うだろう(size_t) -1
式は、タイプのsizeof()
値を生成しますsize_t
。C99標準6.5.3.4から:
結果の値は実装定義であり、その型(符号なし整数型)はsize_tであり、stddef.h(およびその他のヘッダー)で定義されています。
したがって、sizeof()が生成できる最大値はSIZE_MAXです。
ポインタ演算をオーバーフローさせるオブジェクトサイズを許可する標準準拠のコンパイラを使用できます。ただし、結果は未定義です。C ++標準から、5.7 [expr.add]:
同じ配列オブジェクトの要素への2つのポインターを差し引くと、結果は2つの配列要素の添え字の差になります。結果の型は、実装定義の符号付き積分型です。
std::ptrdiff_t
このタイプは、<cstddef>
ヘッダー(18.2)で定義されているものと同じタイプでなければなりません 。他の算術オーバーフローと同様に、結果が提供されたスペースに収まらない場合、動作は未定義です。