Her ikisi de aynı işlev çağrısına dayalı olarak başlatılması gereken iki farklı sabit üye değişkenim varsa, işlevi iki kez çağırmadan bunu yapmanın bir yolu var mı?
Örneğin pay ve payda sabit olan bir kesir sınıfı.
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;
};
Bu, GCD işlevi iki kez çağrıldığından zaman kaybına neden olur. Ayrıca yeni bir sınıf üyesi tanımlayabilir gcd_a_b
ve ilk olarak gcd çıktısını başlatıcı listesinde atayabilirsiniz, ancak daha sonra boşa harcanmış olur.
Genel olarak, bunu işlev çağrıları veya bellek israfı olmadan yapmanın bir yolu var mı? Başlatıcı listesinde geçici değişkenler oluşturabilir misiniz? Teşekkür ederim.
-O3
. Ancak muhtemelen herhangi bir basit test uygulaması için aslında işlev çağrısını satır içine alacaktır. __attribute__((const))
Görünür bir tanım sağlamadan prototip üzerinde veya saf kullanırsanız , GCC veya clang'ın aynı argümanla iki çağrı arasında ortak alt ifade eliminasyonu (CSE) yapmasına izin vermelidir. Drew'un cevabının saf olmayan fonksiyonlar için bile çalıştığını unutmayın, bu yüzden çok daha iyidir ve fonk satır içi olmayabilir her zaman kullanmalısınız.