Jika saya memiliki dua variabel anggota konstan yang berbeda, yang keduanya perlu diinisialisasi berdasarkan pemanggilan fungsi yang sama, apakah ada cara untuk melakukan ini tanpa memanggil fungsi dua kali?
Misalnya, kelas pecahan di mana pembilang dan penyebutnya konstan.
int gcd(int a, int b); // Greatest Common Divisor
class Fraction {
public:
// Lets say we want to initialize to a reduced fraction
Fraction(int a, int b) : numerator(a/gcd(a,b)), denominator(b/gcd(a,b))
{
}
private:
const int numerator, denominator;
};
Ini menghasilkan waktu yang terbuang, karena fungsi GCD disebut dua kali. Anda juga dapat mendefinisikan anggota kelas baru gcd_a_b
,, dan pertama-tama menetapkan output gcd ke yang ada dalam daftar penginisialisasi, tetapi kemudian ini akan menyebabkan memori yang terbuang.
Secara umum, apakah ada cara untuk melakukan ini tanpa panggilan fungsi atau memori yang terbuang? Bisakah Anda membuat variabel sementara dalam daftar penginisialisasi? Terima kasih.
-O3
. Tapi mungkin untuk implementasi tes sederhana itu sebenarnya akan sebaris dengan panggilan fungsi. Jika Anda menggunakan __attribute__((const))
atau murni pada prototipe tanpa memberikan definisi yang terlihat, itu harus membiarkan GCC atau dentang melakukan eliminasi umum-sub-ekspresi (CSE) antara dua panggilan dengan arg yang sama. Perhatikan bahwa jawaban Drew bekerja bahkan untuk fungsi non-murni sehingga jauh lebih baik dan Anda harus menggunakannya kapan saja func mungkin tidak sebaris.