هل هناك أي قيود على العملية فقط باستخدام الأمراض المنقولة جنسيا :: سلسلة بدلا من صفائف شار والأمراض المنقولة جنسيا :: ناقلات / قائمة بدلا من المصفوفات في C ++؟

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

سؤال

ويمكنني استخدام ناقلات، والقوائم، وسلاسل wstrings بقلق شديد في قانون بلدي. هل هناك أي وشملت 22S الصيد التي ينبغي أن تجعل لي أكثر اهتماما باستخدام صفائف من وقت لآخر، حرف وwchars بدلا من ذلك؟

وفي الأساس، إذا كان يعمل في بيئة التي تدعم مكتبة قالب القياسية هناك أي حال استخدام أنواع البدائية هي في الواقع أفضل؟

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

المحلول

ل99٪ من الوقت وعن 99٪ من تطبيقات مكتبة الموحدة، وسوف تجد أن الأمراض المنقولة جنسيا :: وناقلات تكون سريعة بما فيه الكفاية، وسوف الراحة والسلامة تحصل من استخدامها أكثر من تفوق أي تكلفة أداء صغيرة.

لتلك الحالات النادرة جدا عندما كنت حقا بحاجة إلى رمز عارية المعادن، يمكنك علاج متجه مثل مجموعة على غرار C:

vector <int> v( 100 );
int * p = &v[0];
p[3] = 42;

ووC ++ ضمانات القياسية التي يتم تخصيص ناقلات متاخم، لذلك هذا هو مضمون العمل.

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

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

نصائح أخرى

وأود أن التمسك فئات STL (ناقلات، السلاسل، الخ). فهي أكثر أمانا وأسهل استخداما، وأكثر إنتاجية، مع أقل احتمال أن يكون تسرب الذاكرة، وAFAIK، لأنها تجعل بعض إضافي، وقت التشغيل التحقق من الحدود، على الأقل في الوقت DEBUG (البصرية C ++).

وبعد ذلك، وقياس الأداء. إذا كنت تعرف من عنق الزجاجة (ق) على فئات STL، ثم نقل إلى سلاسل النمط C واستخدام المصفوفات.

ومن تجربتي، فإن فرص أن يكون عنق الزجاجة في ناقلات أو استخدام سلسلة منخفضة جدا.

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

إذا كنت لا تحتاج إلى استجابات في الوقت الحقيقي، والعصا مع نهجكم. فهي أكثر أمانا من حرف.

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

ولقد عملت على مشاريع حيث تحويل من الأمراض المنقولة جنسيا :: سلسلة لCONST شار * حفظ الذاكرة ملحوظة (10 من MB). لا أعتقد أن هذه المشاريع هي ما يمكن أن أسميه نموذجية.

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

ولقد عملت في العديد من المشاريع التي أصبحت فوق ذاكرة سلاسل مشكلة.

وانها تستحق النظر مقدما كيف يحتاج التطبيق على نطاق كبير. إذا كنت تحتاج إلى تخزين عدد غير محدود من الجمل، وذلك باستخدام const char*s في جدول سلسلة تمكن عالميا يمكن أن توفر لك كميات كبيرة من الذاكرة.

ولكن بشكل عام، بالتأكيد استخدام أنواع STL اذا لم يكن هناك سبب وجيه جدا أن تفعل خلاف ذلك.

وأعتقد أن أسلوب تخصيص الذاكرة الافتراضية هي منطقة عازلة لناقلات والسلاسل واحد هو أن تخصص ضعف مقدار الذاكرة في كل مرة يحصل على استخدام الذاكرة المخصصة حاليا ما يصل. يمكن أن يكون هذا الإسراف. يمكنك توفير مخصص مخصص بالطبع ...

ووكومة والشيء الآخر للنظر في مقابل الكومة. Staticly صفائف الحجم وسلاسل يمكن أن يجلس على كومة، أو على الأقل مترجم يعالج إدارة الذاكرة بالنسبة لك. سوف المجمعين أحدث التعامل مع صفائف الحجم حيوي بالنسبة لك أيضا إذا كانت توفر ميزة C99 / C ++ 0X ذات الصلة. والنواقل وسلاسل دائما استخدام كومة، وهذا يمكن أن يعرض مشكلات في الأداء إذا كان لديك قيود مشددة حقا.

وكقاعدة عامة من استخدام الإبهام ماذا يكون هناك بالفعل ما لم يضر مشروعك مع النفقات العامة سرعة / الذاكرة ... ستجد على الأرجح أن 99٪ من الاشياء STL شريطة الطبقات توفر لك الوقت والجهد مع قليل من دون تأثير على أداء التطبيقات الخاصة بك. (أي "تجنب الأمثل من السابق لأوانه")

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