ある関係を整数に登録サイズはどうなりますか。
-
21-08-2019 - |
質問
最近では、いった挑戦は、最近のインタビューの文字列操作の問題に適用です。使いいただける反復子を回転するとTCHAR文字(UNICODEのサポート-値(2バイト)。
な考え方は、配列の長さは、curial間違えを使用しないsize_tでintに対して繰り返し処理を実行する。私に準拠しないとわなくてはなりません。
int i, size = _tcslen(str);
for(i=0; i<size; i++){
// code here
}
でも、最大メモリを割り振ることでは限定的である。がある場合との関係int登録サイズで安全に使用する整数です。
E.g.:なく仮想マッピングツールを用いてできるだけ地図2^登録-サイズをバイトです。以来、TCHARは2バイト長で、大半であります。のためのシステムをintとして32ビットの、このあくなってしまうことが問題だんに使用符号なし版のint.人々との組み込みの背景を使ってのintとしての16ビット、メモリサイズ制限されることになる。う思いがある場合の建築ファインチューニングの決定との間の整数を登録サイズです。
解決
C ++標準では、int型のサイズを指定していません。 (それはそのsizeof(char) == 1
、およびsizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
言います。
だから、そこのしません。完全に準拠したC ++の実装は、32ビットレジスタを使用してPC上であなたに256のバイトの整数を与えることができます。しかし、それは非効率的になると思います。
それは、これまでで最も効率的なオプションであるため、そうです、実際には、int
データ型のサイズは、CPUの汎用レジスタのサイズにほぼ等しいです。
int
レジスタより大きかった場合、は、単純な算術演算は、高価であろう複数の命令を必要とするであろう。それらは、レジスタよりも小さかった場合には、ロード及び他のデータを上書きしないように、未使用のビットをマスクするためのプログラムを必要とするレジスタの値を格納します。 (int
データ型は、典型的にshort
よりも効率的である理由である。)
(いくつかの言語は、単にそれが共通のレジスタサイズであるため、それ以外の32ビットが選択された---サイズを登録するためには関係が明らかに存在しなかった場合には、32ビットであることint
を必要とする)
他のヒント
標準により厳密に行く、intは、レジスタサイズにはるかに少ない任意の関係でどのように大きな/小さなについての保証はありません。 (そのセグメントを持つDOSのように:アドレス指定のオフセット)は常にただ一つのレジスタを使用してアクセスされないとメモリ:(ないCPU上のすべてのレジスタが同じサイズであるすなわち)また、いくつかのアーキテクチャは異なるレジスタの大きさを持っています。 最も一般的に使用される基本的なタイプであるはず、それはCPUが上で動作するように最適化されているものだだから言ったことすべてでは、しかし、ほとんどの場合、int型「通常の」レジスタと同じサイズです。
私の知る限りでは、レジスタサイズとint型のサイズとの間に直接のリンクはありません。
あなたがアプリケーションをコンパイルしているどのプラットフォームのために知っているので、しかし、あなたはあなたが必要とするサイズを使用して独自の型の別名を定義することができます:
例
#ifdef WIN32 // Types for Win32 target
#define Int16 short
#define Int32 int
// .. etc.
#elif defined // for another target
次に、宣言エイリアスを使用します。
私は、全く知りません、ここで混合されます。
私は何を言うことができることは、最大速度のための最も実際のプロセッサ上であなたのサイズを登録一致する整数を使用する必要があること、(ちょうど見出しを取る)です。その理由は、x86アーキテクチャ上で、たとえば、は、小さい整数を使用しているとき、あなたはより少ないメモリを必要とすることの利点を持っていること、であるが、の、変換のための追加のコマンドが必要とされています。また、インテルでは、いくつかのpenalityを与えるメモリ(主にレジスタサイズの境界上)非整列へのアクセスの問題を、持っています。 CPUが並列にコマンドを処理することができますので、コースを外れ、今日のプロセッサ上のものは、さらに複雑にしています。だから、いくつかのアーキテクチャのための微調整を終わる。
だから、最良の推測 - architectoreを知らずに - speeedwiseは、限り、あなたはメモリを買う余裕ができ、サイズのint型のレジスタを使用すること、である。
。んのコピーを標準はもちろんのこと、自分のコピー Cプログラミング言語 と第2.2) int
を参照することができるものと整数値には反映さに自然のサイズの整数のホスト機です。" 私のコピー るC++プログラミング言語 という節(4.6)"の int
タイプは選べるのに最適保有-操作する整数で与えられた。"
だだけではない人"ということを思い これは技術的には不備がで拝."
異なるサイズのレジスタの種類があります。重要なのはアドレスレジスタではなく、汎用のものです。マシンが64ビットである場合、アドレスレジスタ(又はそれらの何らかの組合せ)は、汎用レジスタは32ビットであっても、64ビットでなければなりません。この場合、コンパイラは、実際には複数の汎用レジスタを使用して64ビット・アドレスを計算するために、いくつかの余分な作業を行う必要があります。
あなたはハードウェアメーカーは、これまで彼らの登録のための奇妙な設計上の選択を行うことはないと思うなら、あなたはおそらく、元の8086に対処しなければならなかったことはありません「<のhref =」http://en.wikipedia.org/wiki/アドレッシングReal_mode "のrel = "nofollowをnoreferrer">リアルモードで"。