2

ポインター渡しを使用する C++ でのこの swap 関数の簡単なテストを考えてみましょう。

#include <iostream>

using std::cout;
using std::endl;

void swap_ints(int *a, int *b)
{
   int temp = *a;
   *a = *b;
   *b = temp;
   return;
}

int main(void)
{
   int a = 1;
   int b = 0;
   cout << "a = " << a << "\t" << "b = " << b << "\n\n";
   swap_ints(&a, &b);
   cout << "a = " << a << "\t" << "b = " << b << endl;

   return 0;
}

このプログラムは、アドレスで渡した場合よりも多くのメモリを使用しますか? この関数宣言のように:

void swap_ints(int &a, int &b)
{
   int temp = a;
   a = b;
   b = temp;
   return;
}

この参照渡しバージョンの C++ 関数は、ポインター変数を作成する必要がないため、使用するメモリが少なくなりますか?

また、C には、C++ と同じ「参照渡し」機能がありませんか? もしそうなら、それはメモリ効率の良いコードを意味するので、そうではありませんか? そうでない場合、Cがこの機能を採用しないという背後にある落とし穴は何ですか。私が考慮していないのは、C++ がおそらく舞台裏でこの機能を実現するためのポインターを作成するという事実だと思います。これはコンパイラが実際に行うことであり、C++ にはコードがきれいになる以外に真の利点はありませんか?

4

2 に答える 2

1

確認する唯一の方法は、コンパイラがそれぞれに対して生成したコードを調べ、2 つを比較して何が得られるかを確認することです。

そうは言っても、少なくとも合理的に主流のコンパイラでは、実際の違い (少なくとも最適化が有効になっている場合) を見ると少し驚かれることでしょう。過去 10 年ほど更新されていない非常に小さな組み込みシステムのコンパイラでは違いが見られるかもしれませんが、正直なところ、そうである可能性はほとんどありません。

また、ほとんどの場合、このような単純な関数のコードがインラインで生成されることが予想されるため、関数呼び出しやパラメーターの受け渡しがまったく関係していなかったことも付け加えておきます。典型的なケースでは、数回のロードとストアに過ぎない可能性があります。

于 2013-02-26T05:44:20.950 に答える
1

コード内の変数のカウントと、プロセッサが使用するメモリのカウントを混同しないでください。C++ には、人間が簡単に理解できるようにするために、コンパイラの内部動作を隠す多くの抽象化があります。

設計上、C には C++ ほど多くの抽象化レベルはありません。

于 2013-02-26T05:46:54.477 に答える