سؤال

لقد فهم عام restrict لكن أتمنى توضيح بعض النقاط الدقيقة.لدي وظيفة أن يقرأ سلسلة خالية منتهية من واحد العازلة يكتب رابط النسخة المشفرة في آخر العازلة.وظيفة هذا التوقيع (حاليا بدون restrict):

char const *StringUrlEncode(char const *unencoded, 
                            char *encoded,
                            char *encodedEnd);

unencoded هو خالية منتهية المصدر السلسلة.الوجهة العازلة يمثله encoded و encodedEnd, حيث encoded النقاط الأولى char في المخزن المؤقت ، encodedEnd يشير إلى الحرف الأول بعد المخزن المؤقت ، أيوظيفة سوف يكتب charمتروك ولكن وليس بما في ذلك الموقع أشار إلى encodedEnd -- هذا هو الأساسي الخاص بك begin/end مكرر الزوج إذا كنت على دراية C++ الاتفاقيات الدولية الخاصة بلبنان.

إذا قمت بإضافة restrict إلى هذه الوظيفة ، يجب تطبيقه فقط على أول اثنين من المعلمات:

char const *StringUrlEncode(char const *restrict unencoded, 
                            char *restrict encoded,
                            char *encodedEnd);

أم أن هناك بعض المنافع أنا لا فهم مضيفا أن كل ثلاثة المعلمات ؟

أستطيع أن أرى أن جعل المدخلات والمخرجات مخازن restrict يساعد المترجم تعرف أنها لا تتداخل.ولكن منذ المعلمة الأخيرة ، encodedEnd, هو فقط يستخدم لوضع علامة نهاية المخزن المؤقت للإخراج, أنا أفكر restrict لن يكون أي مساعدة المترجم هنا (على الرغم من أنني أفترض أنه لن يضر بخلاف إضافة الضوضاء غير الضرورية إلى وظيفة الإعلان).

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

المحلول

وحاول المادة مايك أكتون هنا . تقييد المخيف لأن كل الآثار المترتبة أداء عدم استخدامه والنتائج المترتبة على استخدامه بشكل غير صحيح.

في قضيتك، وهذا يبدو وكأنك قد تنطبق بأمان تقييد لجميع المؤشرات الثلاثة، أي اسم مستعار منطقة الذاكرة نفسها. ومع ذلك هناك سيكون قليلا من دون فائدة الأداء من استخدامه على المؤشر الثالث.

نصائح أخرى

في هذه الحالة لن يكون هناك فرق بين ما إذا كان encodedEnd هو تقييد أو لا ؛ كنت قد وعدت المترجم أن لا أحد الأسماء المستعارة unencoded و المشفرة, و حتى يقرأ ويكتب لن تتداخل مع بعضها البعض.

السبب الحقيقي أن تحد من المهم في هذه الحالة هو أنه من دون ذلك المترجم لا يعرف أن يكتب من خلال المشفرة لن تؤثر يقرأ من خلال unencoded.على سبيل المثال ، إذا

encoded == unencoded+1

ثم كل الكتابة المشفرة على كل لاحقة قراءة من unencoded, لذا فإن المترجم لا يمكن أن جدول الحمل حتى كتابة أكملت.تقييد وعود المترجم أن اثنين من المؤشرات لا تؤثر على نفس الذاكرة ، لذلك يمكن أن جدول كميات كافية للمستقبل لتجنب خط أنابيب الأكشاك.

وأعتقد أنك محق أنه لن يضر. سوف مؤشر حلقة الخاص بك (نسميها ع) يساوي encodedEnd في نهاية الحلقة. ولكن لا شيء يلزم الوصول إليها بعد حلقة (إما من صفحة أو encodedEnd)، بحيث لا ينبغي أن يكون مشكلة. لا أعتقد أنها سوف تساعد، أيضا، لأن لا شيء من أي وقت مضى كتابة أو قراءة من encodedEnd ذلك لا يوجد شيء لتحسين بعيدا.

ولكن أنا أتفق معك وجود الأولين تقييد ينبغي أن تساعد حقا.

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