Nếu tôi có hai biến thành viên không đổi khác nhau, cả hai biến cần được khởi tạo dựa trên cùng một lệnh gọi hàm, có cách nào để thực hiện việc này mà không gọi hàm hai lần không?
Ví dụ, một lớp phân số trong đó tử số và mẫu số là không đổi.
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;
};
Điều này dẫn đến lãng phí thời gian, vì chức năng GCD được gọi hai lần. Bạn cũng có thể định nghĩa một thành viên lớp mới gcd_a_b
, và trước tiên gán đầu ra của gcd cho nó trong danh sách khởi tạo, nhưng sau đó điều này sẽ dẫn đến lãng phí bộ nhớ.
Nói chung, có cách nào để làm điều này mà không lãng phí các cuộc gọi chức năng hoặc bộ nhớ? Có lẽ bạn có thể tạo các biến tạm thời trong một danh sách khởi tạo? Cảm ơn bạn.
-O3
. Nhưng có lẽ đối với bất kỳ thực hiện kiểm tra đơn giản nào, nó thực sự sẽ thực hiện lệnh gọi hàm. Nếu bạn sử dụng __attribute__((const))
hoặc thuần túy trên nguyên mẫu mà không cung cấp định nghĩa có thể nhìn thấy, thì nên để GCC hoặc clang thực hiện loại bỏ biểu hiện phụ chung (CSE) giữa hai cuộc gọi với cùng một đối số. Lưu ý rằng câu trả lời của Drew hoạt động ngay cả đối với các hàm không thuần túy vì vậy nó tốt hơn nhiều và bạn nên sử dụng nó bất cứ khi nào func có thể không nội tuyến.