Aku tidak akan khawatir tentang hal itu. Jika Anda melakukannya dalam satu loop, string akan selalu mengalokasikan memori untuk meminimalkan realokasi - cukup gunakan operator+=
dalam kasus itu. Dan jika Anda melakukannya secara manual, seperti ini atau lebih lama
a + " : " + c
Kemudian itu membuat temporaries - bahkan jika kompilator bisa menghilangkan beberapa salinan nilai yang dikembalikan. Itu karena dalam pemanggilan berturut-turut operator+
tidak mengetahui apakah parameter referensi mereferensikan objek bernama atau sementara dikembalikan dari sub operator+
pemanggilan. Saya lebih suka tidak khawatir tentang itu sebelum tidak membuat profil terlebih dahulu. Tapi mari kita ambil contoh untuk menunjukkannya. Kami pertama kali memperkenalkan tanda kurung untuk memperjelas pengikatan. Saya meletakkan argumen langsung setelah deklarasi fungsi yang digunakan untuk kejelasan. Di bawah itu, saya tunjukkan apa ekspresi yang dihasilkan kemudian:
((a + " : ") + c)
calls string operator+(string const&, char const*)(a, " : ")
=> (tmp1 + c)
Sekarang, sebagai tambahan, tmp1
adalah apa yang dikembalikan oleh panggilan pertama ke operator + dengan argumen yang ditampilkan. Kami menganggap kompilator benar-benar pintar dan mengoptimalkan salinan nilai kembalian. Jadi kita berakhir dengan satu string baru yang berisi penggabungan dari a
dan " : "
. Sekarang, ini terjadi:
(tmp1 + c)
calls string operator+(string const&, string const&)(tmp1, c)
=> tmp2 == <end result>
Bandingkan dengan yang berikut ini:
std::string f = "hello";
(f + c)
calls string operator+(string const&, string const&)(f, c)
=> tmp1 == <end result>
Ini menggunakan fungsi yang sama untuk sementara dan untuk string bernama! Jadi kompilator harus menyalin argumen ke string baru dan menambahkannya dan mengembalikannya dari badan operator+
. Itu tidak bisa mengambil memori sementara dan menambahkannya. Semakin besar ekspresi, semakin banyak salinan string yang harus dilakukan.
Visual Studio dan GCC berikutnya akan mendukung semantik pemindahan c ++ 1x (melengkapi semantik salinan ) dan rvalue referensi sebagai tambahan eksperimental. Itu memungkinkan untuk mengetahui apakah parameter mereferensikan sementara atau tidak. Ini akan membuat penambahan seperti itu sangat cepat, karena semua hal di atas akan berakhir dalam satu "pipa tambahan" tanpa salinan.
Jika ternyata menjadi hambatan, Anda tetap bisa melakukannya
std::string(a).append(" : ").append(c) ...
The append
panggilan menambahkan argumen untuk *this
dan kemudian kembali referensi untuk diri mereka sendiri. Jadi tidak ada penyalinan sementara yang dilakukan di sana. Atau sebagai alternatif, operator+=
dapat digunakan, tetapi Anda akan membutuhkan tanda kurung yang jelek untuk memperbaiki prioritas.