سؤال

إذا فهمتها بشكل صحيح، __declspec(noalias) يخبر المترجم أن أياً من المؤشرات التي تم تمريرها كمعلمات مستعارة.

__declspec(noalias) void multiply(float * a, float * b, float * c)
{
    ...
}

قيل بشكل مختلف، إذا لم أكن مخطئًا، فهذا يعادل تمامًا الاتصال __restrict على كل معلمة من نوع المؤشر.ولكن هل هناك طريقة للقيام بذلك دون تغيير جميع استدعاءات الوظائف؟من الناحية المثالية، سأستبدل ذلك __declspec(noalias) مع تعريف المعالج.

هل كانت مفيدة؟

المحلول

أعتقد أنك تترجم noalias بشكل غير صحيح؛انها ليست نفس التحديد __restrict على كل معلمة.في ال المثال الذي تشير إليه من MSDN, ، هذا يعني انه a, b, ، و c لا تقم بتعديل أو الإشارة إلى أي حالة عالمية (لوحدة الترجمة الحالية)، ولكنها حرة في تسمية بعضها البعض.يمكنك أيضًا تحديد __restrict على كل واحد للإشارة إلى أنهم لا يستعارون بعضهم البعض.لست متأكدًا من سبب ذكر تغيير جميع استدعاءات الوظائف في هذا السيناريو؛طالما لا يوجد متصل يستخدم أسماء مستعارة للوسائط، فلن يتغير شيء في موقع الاتصال.يجب مراجعة جميع المكالمات، لكن لا يلزم تغييرها إلا إذا كنت بحاجة إلى إزالة الاسم المستعار.خاصة، __restrict يكون لا مطلوب في موقع المكالمة.

وسيكون التماثلي الوحيد في دول مجلس التعاون الخليجي هو التحديد __restrict (أو أكثر شيوعا لدول مجلس التعاون الخليجي, __restrict__) على أي إعلانات لمتغير المؤشر العام في نفس الملف المصدر (والتي هي من أنواع متوافقة).يرى هنا حول نطاق الملف restrict-المؤشرات المؤهلة.وبطبيعة الحال، ليس هناك ما يضمن أن دول مجلس التعاون الخليجي سوف تتصرف بشكل مختلف منذ ذلك الحين restrict غالبًا ما يتم اعتباره فقط في نطاق الوظيفة.قدمت مايكروسوفت بوضوح noalias لتمكين تحسين معين قدموه.

باختصار، لا توجد خدعة ماكرو هنا (بصرف النظر عن تلك التي ذكرها R لتجاهلها __declspec() بالكامل على دول مجلس التعاون الخليجي).أفضل ما يمكنك فعله هو الإضافة __restrict إلى أي معلمة مؤشر غير مستعارة وإعلانات المتغيرات العامة.

نصائح أخرى

فقط #define __declspec(x) (إلى تعريف فارغ).لن يؤدي حذف noalias/restrict إلى إجراء أي تغيير على سلوك من البرنامج الصحيح .كل ما يفعله هو إنشاء فرص إضافية (عادةً ما تكون بسيطة جدًا، باستخدام تقنية المترجم الحالية) للمترجم لتحسينها.

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