C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++でのコピーの省略と戻り値の最適化とは何ですか?


コピーの省略は、コピーの省略とも呼ばれます。これは、コンパイラの最適化手法の1つです。オブジェクトの不要なコピーを回避します。現在のほとんどのコンパイラは、このCopyElision手法を使用しています。

1つのサンプルコードを使用して、どのように機能するかを見てみましょう。

サンプルコード

#include <iostream>
using namespace std;
class MyClass {
   public:
   MyClass(const char* str = "\0") { //default constructor
      cout << "Constructor called" << endl;
   }
   MyClass(const MyClass &my_cls) { //copy constructor
      cout << "Copy constructor called" << endl;
   }
};
main() {
   MyClass ob = "copy class object";
}

出力

Constructor called

では、コピーコンストラクターが呼び出されない理由について説明しましょう。

したがって、オブジェクトが構築されているときに、1つの一時オブジェクトが生成され、実際のオブジェクトにコピーされます。したがって、内部的には次のようになります。

MyClass ob = "copy class object";

として機能します。

MyClass ob = MyClass("copy class object");

C ++コンパイラは、この種のオーバーヘッドを回避します。


  1. C++の++iとi++の違いは何ですか?

    ++のサフィックスバージョンとプレフィックスバージョンには大きな違いがあります。 プレフィックスバージョン(つまり、++ i)では、iの値がインクリメントされ、式の値はiの新しい値になります。したがって、基本的には、最初にインクリメントしてから、式に値を割り当てます。 postfixバージョン(つまり、i ++)では、iの値はインクリメントされますが、式の値はiの元の値です。したがって、基本的には、最初に式に値を割り当ててから、変数をインクリメントします。 例 理解を深めるために、いくつかのコードを見てみましょう- #include<iostream> using name

  2. C ++の符号付きおよび符号なしキーワードとは何ですか?

    C ++のすべての数値タイプには、符号を付けることも付けないこともできます。たとえば、正の整数のみを表すintを宣言できます。特に指定がない限り、すべての整数データ型は符号付きデータ型です。つまり、正または負の値をとることができます。 unsignedキーワードは、符号なしの変数を宣言するために使用できます。 例 #include<iostream> using namespace std; int main() {    unsigned int i = -1;    int x = i;    cout <&l