最近、関数から返される値がconst
変数に割り当てられ、場合によってはconst&
に割り当てられる場合がある、古いコードの一部を分析しています。不思議なことに、私はその違いを見るために解体に切り替えました。上記のコードの以下の解体が無効な最適化とVS2015で取得した戻り値const&const代入 - 逆アセンブリ
struct Data
{
int chunk[1024];
};
Data getData()
{
return Data();
}
int main()
{
const std::string varInit{ "abc" }; // 1
const std::string varVal = "abc"; // 2
const std::string& varRef = "abc"; // 3
const Data dataVal = getData(); // 4
const Data& dataRef = getData(); // 5
return 0;
}
:しかし、ポイントを取得する前に私が参照するためにいくつかのコードを持っている簡単な例を描いてみましょう。
私は、ASMの専門家だんが、一見私は(1)
と(2)
ために行わ同様の操作があることを言うと思います。それにもかかわらず、(3)
には、可変値割り当て中にconst&
が使用されなかった以前のバージョンと比較して、2つの追加操作(lea
およびmov
)が含まれています。
データが値によって関数から返された場合も同様です。 (5)
は、(4)
に関してさらに2つの演算を実行します。
質問は非常に狭いです:
- これらの追加の操作はから来て、ここに彼らの目的は何であるかはどこ?一般的にここにはありません:What's the purpose of the LEA instructionしかし、提示された文脈で。
- これは、少なくとも下位のデータサイズが無視できるオブジェクトの場合、パフォーマンスに影響を及ぼしますか? (例では
Data
構造体とは対照的に) - これは最適化がオンになっているときに影響を与えますか?ちなみに
を(リリースのためのビルド)、私はすでに多少関連しているが、質問の一部ではないことができる値を割り当てる際のconstとconstの&を使用しての長所と短所についてWhy not always assign return values to const reference?を読みました。感覚と同じバイナリコードで - 場合
のようなコードを書く必要があります。 'lea'命令はそのポインタ(' ecx = ebp - 84h')の初期値を計算し、 'mov'命令はその値を' varRef'ポインタに保存します。 – AnT