سؤال

وفق تعزيز :: توثيق tuple, ، الوصول إلى عنصر واحد من tuple له نفس الأداء مثل الوصول إلى متغير عضو. على سبيل المثال ، بالنظر إلى الإعلان التالي:

tuple<A, B, C> t1(A(), B(), C());
struct T { A a; B b; C c; }
T t2;

يجب أن يكون لهذين البيانين أداء متساوٍ (أو مع اختلاف ضئيل):

t1.get<2>();
t2.c;

نظرت إلى مصادر Boost :: Tuple ، وإذا فهمتها بشكل صحيح (لست متأكدًا من أنني فعلت) ، get<N> الوظيفة تنفذ هذا الإجراء في الواقع:

C get<2>(tuple<A, B, C>& t)
{
    return t.tail.tail.head;
    //Generally:  return t.tail. <<N times>> .head;
}

يشبه هذا البحث في قائمة مرتبطة أكثر من الوصول المباشر ، وبقدر ما لا أوقف ، فإن التعقيد O (n) بدلاً من O (1) ، وهو أمر متوقع من وصول عضو. من تجربتي السابقة مع Boost ، أفترض أنني حصلت عليها خطأ ؛ لكن ما هو خطأي؟ كيف get عمل حقيقي؟

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

المحلول

أنت محق في الأداء الذي يشبه القائمة. ومع ذلك ، يمكن حلها في وقت الترجمة وبالتالي يتلخص في O (1) في وقت التشغيل. (بالنظر إلى برنامج التحويل البرمجي تحسين جيد بما فيه الكفاية.)

نصائح أخرى

تذكر ، في C ++ ، مشغل DOT ليس بمثابة احترام للمؤشر ، إنه حساب إزاحة مباشر. الإجابة العامة هي نعم ، i1.i2.i3.in لجميع n هي عملية زمنية ثابتة قابلة للحساب في وقت الترجمة.

إذا كنت تريد أن تتعلم قليلاً عن المحول الرئيسي الداخلي لهذا دون الحفر بعمق شديد ، فابحث عن LLVM GetElementPtr http://llvm.org/docs/langref.html#i_getelementptr هذا هو بالضبط كيف يستهدف برنامج التحويل البرمجي C ++ مثل Clang LLVM عند تجميع مرجع بنيت.

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