Java String は不変であるため、
文字列を作成すると、メモリ ブロックがヒープに割り当てられます。その値を変更すると、その文字列用に新しいメモリ ブロックが作成され、古いメモリ ブロックがガベージ コレクションの対象になります。たとえば、
String str = func1_return_big_string_1()"; //not literal
String str= func2_return_big_string_2()"; //not literal
しかし、ガベージ コレクションが開始されるまでに時間がかかるため、大きな文字列 1 と 2 の両方を含むヒープに実質的にメモリがあります。これが頻繁に発生すると、問題になる可能性があります。
大きな文字列 2 を文字列 1 のメモリ内の同じ場所を使用するようにする方法はありますか? 大きな文字列 2 を str に割り当てるときに余分なスペースを必要としません。
編集:すべての入力に感謝します。最終的に、JavaコードがC ++コードのように動作することを期待すべきではないことに気付きました(つまり、異なるメモリフットプリント)。期待どおりに動作する C++ 11 デモを作成しました。最大のメモリ フットプリントは約 20M (ロードしようとしていた最大のファイル) で、右辺値参照と移動代入演算子はすべて期待どおりに作動します。以下のデモは、VS2012 で c++ 11 を使用して行われました。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <thread>
using namespace std;
string readFile(const string &fileName)
{
ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate);
ifstream::pos_type fileSize = ifs.tellg();
ifs.seekg(0, ios::beg);
vector<char> bytes(fileSize);
ifs.read(&bytes[0], fileSize);
return string(&bytes[0], fileSize);
}
class test{
public:
string m_content;
};
int _tmain(int argc, _TCHAR* argv[])
{
string base("c:\\data");
string ext(".bin");
string filename;
test t;
//std::this_thread::sleep_for(std::chrono::milliseconds(5000));
cout << "about to start" << endl;
for(int i=0; i<=50; ++i) {
cout << i << endl;
filename = base + std::to_string(i) + ext;
//rvalue reference & move assignment operator here
//so no unnecessary copy at all
t.m_content = readFile(filename);
cout << "szie of content" << t.m_content.length() << endl;
}
cout << "end" << endl;
system("pause");
return 0;
}