การเพิ่มประสิทธิภาพของคอมไพเลอร์

ATL 2.1 ได้รับการปรับแต่งสำหรับคอมไพเลอร์ Visual c ++ 5.0 โดยเฉพาะอย่างยิ่ง คุณควรทราบว่า หลาย ATL คลาสที่มีประกาศกับการ ATL_NO_VTABLE แมโคร:

คลา ATL_NO_VTABLE CComControl
{
 nbsp ...
}(&N)

ATL กำหนด ATL_NO_VTABLE เป็นดังนี้:

#ifdef _ATL_DISABLE_NO_VTABLE
 nbsp #กำหนด ATL_NO_VTABLE
#อื่น
   #กำหนด ATL_NO_VTABLE __declspec(novtable)
#endif(&N)

ถ้า _ATL_DISABLE_NO_VTABLE ไม่มีกำหนด ATL_NO_VTABLE แมโครที่ขยายไปยัง declspec(novtable) เมื่อ declspec(novtable) ใช้ในการประกาศคลาส จะป้องกันตัวชี้ vtable ถูกเตรียมใช้งานในระดับชั้นกำหนดและ destructor ตัวเชื่อมโยงการจึงสามารถกำจัด vtable และฟังก์ชันทั้งหมดชี้ไปตาม vtable โดยไม่มีใช้คลามาส่วนใหญ่ (โดยปกติแล้วCComObject, CComAggObjectหรือCComPolyObject) declspec(novtable) และเตรียมจะดังนั้นจึงใช้ตัวชี้ vtable อย่างถูกต้อง?

โดยค่าเริ่มต้น ATL วัตถุตัวช่วยสร้างจะสร้างประเภทใหม่ด้วยการ ATL_NO_VTABLE แมโค อธิบายไว้ว่า ก่อนหน้านี้ declspec(novtable) เท่านั้นจะใช้แอตทริบิวต์กับชั้นฐานที่ creatable โดยตรงไม่ เพิ่มเติม จะไม่ปลอดภัยเมื่อต้องการเรียกใช้ฟังก์ชันต่าง ๆ เสมือนจากที่พารามิเตอร์ของวัตถุใด ๆ ที่ใช้ declspec(novtable) คุณควรย้ายใด ๆ เช่นเรียกเมธอดFinalConstruct?

ถ้าคุณไม่แน่ใจว่าคุณควรใช้การ declspec(novtable) แอตทริบิวต์ คุณสามารถเอาออกการ ATL_NO_VTABLE แมโครจากคำจำกัดความของคลาสใด ๆ หรือคุณทั่วโลกปิดได้ โดยการระบุ #define _ATL_DISABLE_NO_VTABLE ใน stdafx.h, ATL อื่น ๆ ทั้งหมดก่อนที่ ส่วนหัวของแฟ้มมา?

Index