const std::string::size_type cols = greeting.size() + pad * 2 + 2;
なぜstring::size_type
? int
が動作するはずです!それは数字を保持する!string :: size_typeの代わりにint
const std::string::size_type cols = greeting.size() + pad * 2 + 2;
なぜstring::size_type
? int
が動作するはずです!それは数字を保持する!string :: size_typeの代わりにint
短くも数字を保持します。署名されたcharと同じです。
ただし、これらのタイプのいずれも、の文字列のいずれかを表すのに十分な大きさではありません。文字列。
string::size_type
が保証されています。文字列の大きさにかかわらず、文字列のサイズを表すのに十分な大きさの型です。
これがなぜ必要なのか簡単な例については、64ビットプラットフォームを検討してください。 intは通常32ビットですが、2^32バイトをはるかに超えています。
したがって、(signed)intを使用した場合、2^31文字を超える文字列を作成することはできません。 size_typeはこれらのプラットフォームでは64ビットの値になりますが、問題なく大きな文字列を表すことができます。
ネストされたsize_type
typedefはSTL互換コンテナの要件です(std::string
)。そのため、汎用コードはサイズを表す正しい整数型を選択できます。
size_t
は完全にOKです(int
は署名されていないため、署名/符号なしの比較の警告が表示されます)。
ポイントはありませんか?多分、あなたが最も移植性の高いコードを望まないなら、 'size_t'を使うのもいいでしょう。あるいは、今日の最も実用的な状況では、 'size_t'を手に入れることができます。しかし、それにポイントがない場合、 'size_type'は存在しませんでした、それは今でしょうか? –
'size_t' *は十分に大きいことが保証されていますので、必要以上に大きな値を使うためには、ほとんどの場合、レジスタやスタックのスペースを"無駄にする "ことがあります。これらのtypedefは汎用コードで使用するためのものであり、具体的なモデルである 'std :: string'を使用するときではありません。つまり、テンプレート関数の中で任意の 'basic_string'をとっているなら、esp。任意の*アロケータ*で、ネストされたtypedefを使うべきです。しかし、 'size_t'が完全に大丈夫なので、' std :: string'のためのポイントはありません。 –
'size_t'は符号なしです。 'std :: string :: npos'(' pos> = 0'とは対照的)と比較する限り、大丈夫です。 – Jason
あなたが与えてくれた例、
const std::string::size_type cols = greeting.size() + pad * 2 + 2;
がAccelerated C++ by Koenigからです。彼はまた、すなわち、右この後、彼の選択の理由を述べている:
のstd :: string型は、文字列の文字数を保持するための 適切な型の名前であることをsize_typeを定義します。文字列のサイズを格納するローカル変数 が必要な場合は、その変数の型としてstd :: string :: size_typeを使用する必要があります。
colsにstd :: string :: size_typeの種類を指定したのは、です。その数字がどれほど大きいかにかかわらず、挨拶の文字数が であることを確認するためです。単純に がint型のcolsを持っていると言っていますが、実際にはそうしているとおそらく が動作します。しかし、colsの値は、プログラムの への入力のサイズに依存し、その入力の長さを制御することはできません。 誰かが私たちのプログラムに長すぎる文字列を与えるかもしれないと考えられます。 intはその長さを格納するには不十分です。
PowerPCとCellの場合も同様です。そして、私が思い出す限り、アルファにも。もちろん、x64は最近の典型的な64ビットCPUだと思います。 ;) あなたはそうです、明らかにプラットフォームに依存しています。 – jalf
ここでは、どの64ビットLinuxプラットフォームについて話していますか? x64マシンでは、私は最後に試した32ビットのintを持っていました。また、Cellプロセッサではintも32ビットです。そして、私はこれをPowerPCのLinuxにも適用すると仮定している。だからLinux ABIはプラットフォームごとに異なり、私が知っているプラットフォームのほとんどはLinux上でさえ4ビットintを指定しています。 – jalf
しかし、あなたは正しいです。ハードウェアは通常、相互運用性を可能にするためにソフトウェア*が従うべき共通のABIを定義します。 OSはABIを定義しますが、これは通常は同じですが、そうでないかもしれません。コンパイラは実際にはOSに従ったABIを実際に実装しますが、厳密に言えばそうではありません。 – jalf