كيف يمكنني تخصيص سلسلة STD :: على المكدس باستخدام تطبيق سلسلة Glibc؟

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

سؤال

int main(void)
{
   std::string foo("foo");
}

فهمي هو أن الرمز أعلاه يستخدم المخصص الافتراضي للاتصال الجديد. لذلك على الرغم من أن STD :: String Foo مخصص على المكدس يتم تخصيص المخزن المؤقت الداخلي داخل فو على كومة.

كيف يمكنني إنشاء سلسلة يتم تخصيصها بالكامل على المكدس؟

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

المحلول

أردت أن أفعل هذا بنفسي مؤخرا ووجدت التعليمة البرمجية التالية المضيئة:

Chronium's Stack_Container.h.

هذا يحدد جديد std::allocator والتي يمكن أن توفر تخصيصا يستند إلى المكدس للحصول على التخصيص الأولي للتخزين لحاويات STL. لقد انتهيت من العثور على طريقة مختلفة لحل مشكلتي الخاصة، لذلك لم أستخدم الكود بنفسي، ولكن ربما سيكون مفيدا لك. تأكد من قراءة التعليقات في التعليمات البرمجية المتعلقة بالاستخدام والتحذير.

بالنسبة لأولئك الذين شككوا إلى فائدة وحركة القيام بذلك، فكر في:

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

علق بعض الأشخاص أن السلسلة التي تستخدم التخصيص القائم على المكدس لن تكون std::string كما لو أن هذا يتضاءل بطريقة أو بأخرى فائدةه. صحيح، لا يمكنك استخدام الاثنين بالتبادل، لذلك لن تكون قادرا على تمريرك stackstring للوظائف تتوقع std::string. وبعد ولكن (إذا كنت تفعل ذلك بشكل صحيح)، فستتمكن من استخدام جميع وظائف الأعضاء الخاصة بك stackstring أنك تستخدم الآن على std::string, ، مثل find_first_of(), append(), ، إلخ. begin() و end() سوف لا تزال تعمل بشكل جيد، لذلك ستتمكن من استخدام العديد من خوارزميات STL. بالتأكيد، لن يكون std::string في ضوء الإشعار، لكنها ستظل "سلسلة" بالمعنى العملي، وسوف يكون مفيدا للغاية.

نصائح أخرى

المشكلة هي std::basic_string لديه معلمة قالب للمكونات. لكن std::string ليس قالب وليس لديه معلمات.

لذلك، يمكنك استخدام مبدأ إنشاء مثيل std::basic_string مع مصلح يستخدم الذاكرة على المكدس، لكن لن يكون std::string. وبعد على وجه الخصوص، لن تحصل على تعدد الأشكال وقت التشغيل، ولم تتمكن من اجتياز الكائنات الناتجة في وظائف تتوقع std::string.

لا يمكنك. إلا...

std::string هو مثيل

std::basic_string<class CharType, 
                  class Traits=char_traits<CharType>, 
                  class Allocator=allocator<CharType> >

هل يمكن أن تصور من تصور فئة المصلة التي تستخدم Alloca. لإدارة الذاكرة. هذا لن يعمل إلا إذا كان المكونات نفسها، و basic_string الأساليب التي تستدعوها بشكل مباشر أو غير مباشر، كلها inline. وبعد أ basic_string الكائن الذي تم إنشاؤه باستخدام هذا المخصص لن يكون أ std::string, ، ولكن ستصرف (في الغالب) مثل ذلك. ومع ذلك، سيكون هذا قدرا عاديا من العمل للحصول على مكاسب محدودة. على وجه التحديد، فإن استخدام هذه الفئة لإرجاع القيم من وظيفة سيكون خطوة قصر مهنية.

ليس لدي فكره لماذا أنت أو أي شخص آخر يريد القيام بذلك.

أظن أن القيام بمثل هذا الشيء سيكون من الصعب القيام به، وأتساءل لماذا تريد أن تفعل ذلك؟ لتخصيص شيء كاملا على المكدس، يحتاج المحول البرمجي إلى معرفة وقت ترجمة ما هو الحجم الدقيق للشيء هو - في مثالك، ستحتاج إلى معرفة ليس فقط حجم std::string البيانات الوصفية، ولكن أيضا حجم بيانات السلسلة نفسها. هذا ليس مرنا للغاية، ربما تحتاج إلى أنواع سلسلة مختلفة حسب حجم بيانات السلسلة التي ترغب في تضمينها في ذلك - وليس من المستحيل القيام به، فقط سيميل إلى تعقيد الأمور قليلا.

  • STD :: سلسلة سوف تدير دائما التخزين الداخلي مع جديد / حذف.
  • لست متأكدا لماذا يحتوي سؤالك تنفيذ سلسلة GLIBC. وبعد تنفيذ السلسلة لمكتبة C ++ القياسية لا علاقة له glibc..
  • الطريقة الوحيدة لتخزين سلسلة على المكدس هي استخدام صفيف CHAR C على المكدس (مثل ما حدده Shhnap). لكن هذا ربما لا ما تريد على أي حال :-)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top