頻繁に使用する予定のデータを保持するクラスがあるので、そのクラスへのconst参照を返すのが最善だと思いました。ただし、いくつかのパラメーターを指定すると、その場で新しいデータを作成する必要がある場合があります。次のように、一時参照を定数参照に戻すことができることを確認しました。
class Foo {
public:
Foo() { ... } //Initialize data
LARGE_DATA getData(bool param1, bool param2) {
if (...) { // For some crazy function of the parameters
LARGE_DATA newData = ...; // Create new data and return it
return newData
}
return data; // Usually, will just use the default value
}
private:
LARGE_DATA data;
};
void bar() {
Foo f;
const LARGE_DATA& data = f.getData();
... // Process data (read-only)
}
しかし、これはのコピーを作成するようですdata
。私はこのようなことをしたいと思います:
class Foo {
public:
Foo() { ... } //Initialize data
const LARGE_DATA& getData(bool param1, bool param2) {
if (...) { // For some crazy function of the parameters
LARGE_DATA newData = ...; // Create new data and return it
return newData
}
return data; // Usually, will just use the default value
}
private:
LARGE_DATA data;
};
void bar() {
Foo f;
const LARGE_DATA& data = f.getData();
... // Process data (read-only)
}
不要なコピーを避けるためです。Visual Studioはこれについて文句を言いませんが、g ++は文句を言います(そしておそらく当然そうです)。これを行う正しい方法は何ですか?