3

最近、私は最近のインタビューで文字列操作の問題に挑戦し、パフォーマンスを最適化するよう求められました。TCHAR 文字間を行き来するにはイテレータを使用する必要がありました (UNICODE サポート - それぞれ 2 バイト)。

配列の長さをあまり考えていなかったので、size_t を使用せずに int を使用して繰り返し処理するという奇妙な間違いを犯しました。準拠しておらず、安全ではないことを理解しています。

int i, size = _tcslen(str);    
for(i=0; i<size; i++){
   // code here
}

ただし、割り当てることができる最大メモリには制限があります。また、int とレジスタのサイズに関係がある場合は、整数を使用しても安全な場合があります。

例: 仮想マッピング ツールがないと、2^レジスタ サイズのバイトしかマップできません。TCHAR の長さは 2 バイトなので、その半分です。int が 32 ビットのシステムでは、符号なしバージョンの int を使用しなくても、これは問題になりません。バックグラウンドが埋め込まれている人は int を 16 ビットと考えていましたが、そのようなデバイスではメモリ サイズが制限されます。したがって、整数とレジスタのサイズの間にアーキテクチャ上の微調整の決定があるのではないかと思います。

4

6 に答える 6

4

C++ 標準では、int のサイズが指定されていません。(それは、、、と言っていsizeof(char) == 1ますsizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

したがって、レジスタのサイズに関係がある必要ありません。完全に準拠した C++ 実装では、32 ビット レジスタを使用する PC で 256 バイトの整数が得られます。でも非効率でしょう。

そうです、実際には、intデータ型のサイズは通常、CPU の汎用レジスタのサイズと同じです。これが最も効率的なオプションであるためです。

がレジスタよりも大きい場合、int単純な算術演算には複数の命令が必要になり、コストがかかります。それらがレジスタよりも小さい場合、レジスタの値をロードして格納するには、他のデータの上書きを避けるために、プログラムで未使用のビットをマスクする必要があります。int(これが、通常、データ型が よりも効率的である理由ですshort。)

(一部の言語では、intが 32 ビットである必要があります。その場合、明らかにレジスタ サイズとの関係はありません --- 一般的なレジスタ サイズであるため、32 ビットが選択されること以外は)

于 2009-07-03T11:56:50.993 に答える
3

厳密に言えば、 int がどれくらい大きいか小さいかについての保証はなく、レジスタサイズとの関係はなおさらです。また、一部のアーキテクチャではレジスタのサイズが異なり (つまり、CPU 上のすべてのレジスタが同じサイズであるとは限りません)、メモリは常に 1 つのレジスタのみを使用してアクセスされるとは限りません (DOS のセグメント:オフセット アドレッシングのように)。ただし、ほとんどの場合、 int は「通常の」レジスタと同じサイズです。これは、最も一般的に使用される基本型であると想定されており、CPU が動作するように最適化されているためです。

于 2009-07-03T11:02:50.407 に答える
2

サイズの異なるさまざまな種類のレジスタがあります。重要なのはアドレスレジスタであり、汎用レジスタではありません。マシンが64ビットの場合、汎用レジスタが32ビットであっても、アドレスレジスタ(またはそれらの組み合わせ)は64ビットである必要があります。この場合、コンパイラは、複数の汎用レジスタを使用して64ビットアドレスを実際に計算するために、追加の作業を行う必要がある場合があります。

ハードウェアメーカーがレジスタに対して奇妙な設計上の選択をすることはないと思われる場合は、おそらく元の8086「リアルモード」アドレス指定を扱う必要はありませんでした。

于 2009-07-03T13:32:25.180 に答える
2

私は標準のコピーを持っていませんが、C プログラミング言語の私の古いコピー (セクション 2.2)intは、「整数、通常はホスト マシン上の整数の自然なサイズを反映する」と述べています。The C++ Programming Language の私のコピー(セクション 4.6)intには、「指定されたコンピューターで整数を保持および操作するのに最も適した型が選択されるはずです」と書かれています。

「これが技術的な欠陥であることは認めますが、実際には悪用できるものではありません」と言う人はあなただけではありません。

于 2009-07-03T13:21:48.513 に答える
2

私の知る限り、レジスタのサイズと int のサイズの間に直接のリンクはありません。

ただし、アプリケーションをコンパイルするプラットフォームがわかっているため、必要なサイズで独自の型エイリアスを定義できます。

#ifdef WIN32 // Types for Win32 target
#define Int16 short
#define Int32 int
// .. etc.
#elif defined // for another target

次に、宣言されたエイリアスを使用します。

于 2009-07-03T10:52:41.333 に答える
2

いくつかの異なる問題 (メモリ サイズ、割り当て、レジスタ サイズ、パフォーマンス?) がここに混在しているため、これが正しいことを理解していれば、私は完全には認識していません。

私が言えることは(見出しだけをとって)、ほとんどの実際のプロセッサで最大速度を得るには、レジスタサイズに一致する整数を使用する必要があるということです。その理由は、より小さい整数を使用すると、必要なメモリが少なくて済むという利点があります、たとえば x86 アーキテクチャでは、変換のための追加のコマンドが必要になるためです。また、Intel では、アラインされていない (ほとんどの場合、レジスタ サイズの境界にある) メモリにアクセスすると、何らかのペナルティが発生するという問題があります。もちろん、今日のプロセッサでは、CPU がコマンドを並行して処理できるため、状況はさらに複雑になります。そのため、一部のアーキテクチャの微調整が必​​要になります。

したがって、アーキテクトを知らなくても、メモリに余裕がある限り、レジスタサイズのintを使用するのが最善の推測です。

于 2009-07-03T11:34:38.893 に答える