في C++، هل يمكن للمنشئ والمدمر أن يكونا وظائف مضمنة؟

StackOverflow https://stackoverflow.com/questions/21303

  •  09-06-2019
  •  | 
  •  

سؤال

يقوم VC++ بإنشاء الوظائف التي يتم تنفيذها ضمن الوظائف المضمنة لإعلان الفئة.

إذا أعلنت فئة Foo كما يلي، إذن هل الدالتان CONSTRUCTOR و DESTRUCTOR مضمنتان؟

class Foo 
{
    int* p;
public:
    Foo() { p = new char[0x00100000]; }
    ~Foo() { delete [] p; }
};

{
    Foo f;
    (f);
}
هل كانت مفيدة؟

المحلول

تحديد نص المنشئ داخل الفصل له نفس تأثير وضع الوظيفة خارج الفصل باستخدام الكلمة الأساسية "المضمنة".

في كلتا الحالتين هو تلميح للمترجم.لا تعني الوظيفة "المضمنة" بالضرورة أن الوظيفة ستكون مضمنة.يعتمد ذلك على مدى تعقيد الوظيفة والقواعد الأخرى.

نصائح أخرى

الإجابة القصيرة هي نعم.يمكن الإعلان عن أي دالة في السطر، ويعد وضع نص الدالة في تعريف الفئة إحدى الطرق للقيام بذلك.كان بإمكانك أيضًا القيام بما يلي:

class Foo 
{
    int* p;
public:
    Foo();
    ~Foo();
};

inline Foo::Foo() 
{ 
    p = new char[0x00100000]; 
}

inline Foo::~Foo()
{ 
    delete [] p; 
}

ومع ذلك، الأمر متروك للمترجم إذا كان يقوم بالفعل بتضمين الوظيفة.يتجاهل VC++ طلباتك للتضمين إلى حد كبير.سيتم تضمين وظيفة فقط إذا اعتقدت أنها فكرة جيدة.ستقوم الإصدارات الحديثة من المترجم أيضًا بتضمين الأشياء الموجودة في ملفات .obj المنفصلة والتي لم يتم الإعلان عنها في السطر (على سبيل المثال.من التعليمات البرمجية في ملفات .cpp مختلفة) إذا كنت تستخدم ربط توليد رمز الوقت.

يمكنك استخدام __forceinline الكلمة الأساسية لإخبار المترجم أنك تقصد ذلك حقًا عندما تقول "تضمين هذه الوظيفة"، لكن الأمر لا يستحق ذلك في العادة.في كثير من الحالات، المترجم يعرف حقًا الأفضل.

وضع تعريف الوظيفة في نص الفصل يعادل وضع علامة على وظيفة باستخدام الكلمة الأساسية المضمنة.وهذا يعني أن الوظيفة قد تكون أو لا تكون مضمنة بواسطة المترجم.لذا أعتقد أن أفضل إجابة ستكون "ربما"؟

إلى نفس الحد الذي يمكننا من خلاله جعل أي وظيفة أخرى مضمنة، نعم.

يتم تحديد التضمين أم لا في الغالب بواسطة المترجم الخاص بك.مضمنة في التعليمات البرمجية تلميحات فقط للمترجم.
إحدى القواعد التي يمكنك الاعتماد عليها هي أن الوظائف الافتراضية لن يتم تضمينها أبدًا.إذا كانت فئتك الأساسية تحتوي على مُنشئ/مدمر افتراضي، فمن المحتمل ألا يتم تضمين فئتك أبدًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top