1

Cでは、ループの外側ですべての変数を宣言することと、スコープを除いて内側でいくつかの変数を宣言することの間に違いはありますか? 一方の方法は他方の方法より速いですか? 例えば:

int i;
for(i = 0; i < len; i++)
{
  int j;
  for(j = i; j < len; j++)
  {
    …

int i, j;
for(i = 0; i < len; i++)
{
  for(j = i; j < len; j++)
  {
    …

最初の例では、繰り返しごとに同じ変数が再宣言されているため、概念レベルでは問題がありますが、それは非効率的ではありませんか?

4

4 に答える 4

2

そのループ内でのみ変数のスコープを制限することをお勧めします。割り当ての観点からは、ループの外側とループの内側で変数を宣言することに違いはありません。

コードを逆アセンブリすると、両方のケースで同じコードが得られるはずです。変数のストレージがどこに割り当てられているかが正確にわかります。ループの外側に割り当てられています。

于 2013-10-05T08:37:02.850 に答える
1

最新の C (別名 C99 または C11) では、より良いオプションがあります

for(int i = 0; i < len; i++)
{
  for(int j = i; j < len; j++)
  {

つまり、forステートメント内でループ変数を直接宣言します。

あなたのような単純なケースでは、どのレベルでも違いはありません。これはすべて同じバイナリにコンパイルされます。

より複雑なケースでは、別の目的で同じ変数を「再利用」するため、1 つある可能性があります。物事を簡単に混同し、古い値を以前の使用から、予期しない場所に流してしまう可能性があります。

軽微な余談:intほとんどの場合、「長さ」などを表すループ インデックスの正しい型ではありません。インデックスは負であってはならず、型の幅は、任意のオブジェクトのサイズをキャプチャできるようにする必要があります。現代のCはsize_tその目的のために持っています。

gcc でその機能を使用するには、スイッチを追加する-std=c99か、実行可能ファイル名を使用する必要がありますc99。clang および POSIX マシン上の他の多くのコンパイラは、デフォルトで C99 に準拠しています。

于 2013-10-05T09:16:41.930 に答える
0

ループ (ブロック) 内で宣言された変数は、そのブロックにのみアクセスできます。つまり、その特定のブロックに対してローカルです (宣言のポイントから、このスコープを超えてアクセスできないブロックの最後まで表示されます)。
コード内

int i;
for(i = 0; i < len; i++)
{
   int j;
   for(j = i; j < len; j++)
   {
       …

jはローカル変数であり、ブロック スコープを持ちます。終了後、プログラムにfor(i = 0; i < len; i++)アクセスすることはできません。jへのすべての変更jは、この範囲内にとどまります。
変数のスコープをアカウントに取り込んでいない場合、ループの場合、どのレベルでも変数を宣言しても違いはありません (ただし、ここでは両方のコードが異なります)。

于 2013-10-05T08:35:43.233 に答える
0

スコープを制限すると、コンパイラがコードを最適化しやすくなります (たとえば、レジ​​スタで使用する変数を決定するなど)。優れたコンパイラは、最適化された条件下で、ループの開始時に変数を「再宣言」して時間を無駄にすべきではありません。

于 2013-10-05T12:41:53.547 に答える