Const سلسلة منشئ هذا لا تخصص أي شار الذاكرة ؟
سؤال
أنا أحاول تحسين بعض التعليمات البرمجية كتبت التعامل مع عدة طبقات من تطبيق البروتوكول.أنا جعلت استخدام ليبرالية من 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_ref
s حتى مكدس بدلا من ذلك.الشيء الوحيد الذي عليك أن تقلق بشأن حفظ الأصلي العازلة على قيد الحياة طوال الوقت.