C++学習ノート4----書き込み時コピー技術1(参照カウントの使用について)

2105 ワード

まず、書き込み時のレプリケーションとは何かを理解します.Scott Meyersは、本当にストレージスペースが必要なときに変数(メモリの割り当て)を宣言することをお勧めします.これにより、プログラムが実行されるときに最小のメモリコストがかかり、それが実行されるとメモリの割り当てという時間のかかる作業が行われ、プログラムが実行されるときにパフォーマンスが向上します.書き込み時レプリケーション(Copy-On-Write)技術は、プログラミング界の「怠惰な行為」である遅延戦術の産物である.
std::stringクラスを例にとると、次の問題を考慮します.
1.書くときにコピーする原理は何ですか.
2.stringクラスはどのような状況でメモリを共有しますか?
3.stringクラスは、書き込み時にコピーをトリガーするのはどのような場合ですか?
Copy-On-Writeは必ず「参照カウント」を使用しており、必ずRefCntに似た変数があります.最初のstringオブジェクトstr 1が構築されると、stringの構築関数は、入力されたパラメータに基づいてスタックからメモリを割り当て、他のstringオブジェクトがstr 1をコピーすると、このRefCntは自動的に1を加算します.オブジェクトプロファイルがある場合、このカウントは1を減らし、最後のオブジェクトプロファイルがある場合、RefCntが0になるまで、プログラムはスタックから割り当てられたメモリを本当に解放します.
では、最初の質問です.RefCntはどこに保管されていますか.
stringクラスに格納されている場合、各stringのインスタンスはそれぞれ独自のRefCntを持ち、RefCntを共有することはできません.
グローバル変数、または静的メンバーとして宣言されている場合は、すべてのstringクラスが1つ共有されているので、これもできません.
結論として、size(str)+1、最後のビットを参照カウントを格納するために使用することができ、これにより、異なるstrインスタンスごとに対応する参照カウントがあり、読み書きに非常に役立ちます.
2つ目の質問:stringクラスはどのような状況でメモリを共有しますか?
1)1つのオブジェクトで自己を作成する(コンストラクション関数をコピーする)
-stringクラスのコピーコンストラクタでポイント処理を行い、参照カウントを加算するだけです.
2)1つのオブジェクトで値を割り当てる(値付け演算子を再ロード)
3つ目の質問:stringクラスは、書き込みがトリガーされたときにコピーされますか?
Copy-On-Writeは、同じメモリを共有するクラスでコンテンツが変更された場合に発生します.
 
次に、参照カウントの実装方法をコードで示します.
 
#include 
#include 
#include 
using namespace std;

class String
{
public:
	String();
	String(const char * pstr);
	String(const String & rhs);
	String & operator=(const String & rhs);

	const char * c_str() const
	{
		return _pstr;
	}

	char & operator[](size_t idx);

	size_t size() const
	{
		return strlen(_pstr);
	}

	size_t refcount() const
	{
		return _pstr[size() + 1];
	}

	friend std::ostream & operator< 1)
		{
			decreaseRefcount();
			char * ptemp = new char[size() + 2]();
			strcpy(ptemp, _pstr);

			_pstr = ptemp;
			init_refcount();
		}
		return _pstr[idx];
	}
	else
	{
		static char nullchar = '\0';
		cout << "    " << endl;
		return nullchar;
	}
}

std::ostream & operator<