หากฉันมีตัวแปรสมาชิกคงที่แตกต่างกันสองตัวซึ่งทั้งสองต้องเริ่มต้นใหม่โดยใช้การเรียกฟังก์ชันเดียวกันมีวิธีการทำเช่นนี้โดยไม่ต้องเรียกใช้ฟังก์ชันสองครั้งหรือไม่
ตัวอย่างเช่นคลาสเศษส่วนที่ตัวเศษและตัวหารเป็นค่าคงที่
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;
};
ส่งผลให้เสียเวลาเนื่องจากฟังก์ชั่น GCD ถูกเรียกสองครั้ง คุณสามารถกำหนดสมาชิกคลาสใหม่gcd_a_b
และก่อนกำหนดเอาต์พุตของ gcd ให้กับรายการนั้นในรายการ initializer แต่สิ่งนี้จะนำไปสู่การสูญเสียความจำ
โดยทั่วไปแล้วมีวิธีการทำเช่นนี้โดยไม่ต้องใช้ฟังก์ชั่นการโทรหรือหน่วยความจำที่สูญเปล่า คุณสามารถสร้างตัวแปรชั่วคราวในรายการ initializer ได้หรือไม่? ขอบคุณ.
-O3
หรือเสียงดังกราว แต่อาจเป็นไปได้สำหรับการทดสอบการใช้งานง่าย ๆ จริง ๆ แล้วมันจะอินไลน์เรียกฟังก์ชัน หากคุณใช้__attribute__((const))
หรือบริสุทธิ์บนต้นแบบโดยไม่ต้องให้คำจำกัดความที่มองเห็นได้มันควรปล่อยให้ GCC หรือเสียงดังกราวทำการกำจัด subexpression ทั่วไป (CSE) ระหว่างการเรียกสองครั้งด้วย ARG เดียวกัน โปรดทราบว่าคำตอบของ Drew นั้นใช้ได้กับฟังก์ชั่นที่ไม่บริสุทธิ์ดังนั้นจึงดีกว่ามากและคุณควรใช้ฟังก์ชั่นเมื่อ func อาจไม่อินไลน์