سؤال

أنا أحاول تحسين بعض التعليمات البرمجية كتبت التعامل مع عدة طبقات من تطبيق البروتوكول.أنا جعلت استخدام ليبرالية من std::string فئة ، كما يسعى إلى البساطة بدلا من السابق لأوانه الأمثل.التطبيق بطيئة جدا ، valgrind & gprof تظهر أقضي وقتا كبيرا نسخ-بناء سلاسل العازلة يتحرك صعودا خلال المكدس.

يبدو لي أنه بعد نسخ حرف من نظام المخزن المؤقت إلى أدنى تطبيق buffer, يجب أن تكون قادرة على تجنب نسخ البيانات أكثر:بعد كل شيء, هو لا تحور كما يتحرك صعودا المكدس.

نظامي شكل هو "نقل" ، تتألف من واحد أو أكثر السطر-إنهاء السجلات, تتألف كل منها من عدة مفصول الحقول, وانتهت مع رمز خاص.E. g.

RECORD 1\tHAS\tTHESE\tFIELDS\nRECORD 2\tLOOKS\tLIKE\tTHIS\nEND-OF-TRANSMISSION\n

هذا من شأنه أن يكون تجميعها في مكان واحد std::string ودعا input_buffer.

تجهيز انتقال ينطوي على استخراج سجل من المخزن المؤقت وتمريرها إلى الطبقة التالية;استخراج ناقلات الحقول من سجل وتمريرها إلى الطبقة التالية;تخزين الحقول في الخريطة.في كل مرحلة البيانات يتم نسخ جديدة std::السلاسل المخصصة.

هل من الممكن تخصيص const سلسلة من فهرس إلى input_buffer و طول ...دون أي نسخ ؟ على سبيل المثال, سجل 2 يبدأ في تعويض 26 و 24 بوصة طويلة:

const std:string record (substr(input_buffer, 26), 24 );

أنا لست على دراية أحشاء من سلسلة كائن, لكن أدائها ضمانات يبدو ان هذا يعني أنه في مكان ما هناك بسيطة شار تسلسل و تقريبا بلا شك مؤشر إلى أولئك حرف' الذاكرة.يمكن أن يكون مؤشر تهيئة الذاكرة ينتمون إلى آخر السلسلة ؟

(بلدي المترجم هو g++ 4.7 ، ولكن إذا كان هذا هو الشيء الذي يتطلب 4.8, أقدر لك معرفة حول ذلك أيضا.)

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

المحلول

ما فهمت, هذا يبدو وكأنه مرشح جيد دفعة::string_ref.يمكنك أن تفعل ببساطة boost::string_ref input(input_buffer); ومن ثم تمرير string_refs حتى مكدس بدلا من ذلك.الشيء الوحيد الذي عليك أن تقلق بشأن حفظ الأصلي العازلة على قيد الحياة طوال الوقت.

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