web-dev-qa-db-ja.com

size_tの最大値を見つけるポータブルな方法は何ですか?

私のプログラムが実行されているシステムのsize_tの最大値を知りたいのですが。私の最初の本能は、次のように負の1を使用することでした。

size_t max_size = (size_t)-1;

しかし、もっと良い方法、またはどこかで定義された定数があると思います。

71
Justicle

マニフェスト定数(マクロ)はC99に存在し、SIZE_MAXと呼ばれます。ただし、C89/90にはそのような定数はありません。

ただし、元の投稿にあるのは、size_tの最大値を見つける完全に移植可能な方法です。符号なしの型で動作することが保証されています。

68
AnT
#define MAZ_SZ (~(size_t)0)

またはSIZE_MAX

14
nategoose

OPによって提案されたsize_t max_size = (size_t)-1;ソリューションはこれまでのところ間違いなく最良ですが、私はこれを行うための別の、より複雑な方法を見つけました。学術的な好奇心のためだけに投稿しています。

#include <limits.h>

size_t max_size = ((((size_t)1 << (CHAR_BIT * sizeof(size_t) - 1)) - 1) << 1) + 1;
4
Praetorian

他の回答で提案されているビット操作の代替として、C++でこれを行うことができます

#include <limits>
size_t maxvalue = std::numeric_limits<size_t>::max()
4
kalmiya

少なくともC++ 11コンパイラを想定している場合は、SIZE_MAXを利用できます。

http://en.cppreference.com/w/c/types/limits

0
Shital Shah