الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

يا مبرمجي ++c, لا تلعبوا كثيراً بالمؤشرات و استخدموا Stl !

مغلق
بدأه Khaled.Alshaya في 14 يناير 2008 · 13 رد · 2,195 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله ,,

في الحقيقة كنت أقرأ اليوم موضوعاً حول المؤشرات, و من ضمن الحديث اتى ذكر المصفوفات الديناميكية و الـ linked lists, و من المعروف أن الـ linked lists يمكن تصميمها بسهولة و خصوصاً عند الحديث عن زيادة الحجم تلقائياً عند إضافة عنصر جديد للـ list, لا علينا,

المهم أن المصفوفات أسرع بكثير من الـ linked list, و لكن العيب الوحيد هو الحاجة إلى نسخ المصفوفة إلى مصفوفة جديدة أكبر بعنصر واحد و حذف المصفوفة القديمة كل مرة نقوم بإضافة عنصر جديد, و هذا بالطبع يستهلك وقتاً ليس بالهين عندما نبدأ بإدخال عنصر و ننتهي بألف عنصر آخر الأمر,

توقعت في بداية مشوراي مع البرمجة أن أحد أهم عناصر STL أو ما يسمى بالمصفوفات الجديدة B) في ++C الـ vector يستخدم الـ linked list ,, و لكني اكتشفت أنه يستخدم المصفوفات بدلاً من ذلك, كل المبرمجين المحترفين ينصحون باستخدام الـ vector بدلاً من التلاعب بالمؤشرات, ليس فقط من أجل الأمان, و لكن من أجل زيادة الكفائة و سرعة البرنامج B) خصوصا عندما يكون عدد العناصر كبيراً!

هل لدى أحدكم فكرة, كيف يمكن للـ vector أن يمتلك سرعة فائقة في عملية الإضافة باستخدام المصفوفات دون اللجوء إلى الـ linked list ؟؟؟

أنا في الانتظار لمناقشة الموضوع!

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 14 يناير 2008 في 14:19 — السبب: أخطاء إملائية

#2

والله انا استخدم GlobalReAlloc او HeapReAlloc لزيادة حجم مصفوفة ما انشءتها عن طريق HeapAlloc or GlobalAlloc

لم استخدم دوال السي مثل new - malloc الا اذا كانت المصفوفة صغيرة وبذلك السرعة غير مطلوبة

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

أهلاً يا باشا :rolleyes:

و الله الدوال اللي انت تكلمت عنها لا أعرفها أبداً :wacko: هل الدوال تبع win api ؟؟

لأنه أعتقد أن new تستخدم دوال نظام التشغيل أيضاً,

تحياتي ,,

#4

نعم هي دوال API ولاحظت ان مكتبات السي تستخدمها

مثلا new اذا كان حجم الـheap الذي خصصه البرنامج مسبقا قد امتلئ تقوم باستدعاء HeapAlloc جديدة وهكذا

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#5
GamingMasteR كتب:
نعم هي دوال API ولاحظت ان مكتبات السي تستخدمها

مثلا new اذا كان حجم الـheap الذي خصصه البرنامج مسبقا قد امتلئ تقوم باستدعاء HeapAlloc جديدة وهكذا

جميل جداً :resentful:

و لكن السؤال الأصلي لم يتم الإجابة عليه :D

مع ملاحظة أن السرعة التي يتميز بها الـ vector ليست بسبب استخدمه لدالة معينة! بل هناك طريقة معينة يتبعها في حجز الذاكرة,

هل لديكم أفكار يمكن طرحها!

تحياتي ,,

#6

السلام عليكم..

ليس مطلوب من المهندس ان يعرف الطريقة التي تعمل بها المقاومة وليس من الحكمة ان يفتح تلك المقاومة

ليري ما بداخلها كل ما عليك هو اخذ المقاومة المناسبة واستخدامها في الجهاز

هكذا قال لنا الدكتور لكني من صغري احب ان افتح الاشياء لاري ما بداخلها :lol:

موضوع المصفوفات يعتبر من المواضيع المعقدة لكن بالنقاش يمكن ان نساهم في تفسير الكثير من المواضيع المتعلقة به.

اتاحت مكتبة القوالب لمبرمجي السي بلس الكثير من مميزات التي جعلت من استخدام هذا المكتبة امر لا مفر منه

وذلك اذا عرفنا انها من المكتبات التي يعمل الاف المبرمجين والشركا ت علي تطويرها كل عام. وهي ليست حكرا علي شركة ميكروزفت.

ومن هذه المميزات هي تسهيل التعمل مع المصفوفات، حيث اتاحت هذه المكتبة ثلاث نوع من الطبقات لادارة المصفوفات

وهي vector و deque و list و جميع هذا الانواع يخزن عناصر المصفوفة في مقاطع خطية (متتالية مثل المصفوفة العادية التي تعرفها)

وتوفر وصول عشوائي الي عناصر المصفوفة .

لنعود الي vector المتجه.

يحتوي كائن المتجه علي حاوية container هذه الحاوية تعتبر هي البيانات نفسها

ولدي هذه الحاوية القدرة علي توسيع نفسها لاستعاب البيانات.

عند انشاء متجه جديد يقوم الـ container الخاص بهذا المتجه بحجز مساحة عدة عناصر من الذاكرة

اي ينشي مصفوفة مقدما حتي ولو لم يتم اضافة اي عنصر للمتجه. يسمي هذا الحجم لهذه المصفوفة

بالحجم الافتراضي للمصفوفة وليس الحجم الحقيقي .

عندما يصل (يتساوي) الحجم الحقيقي للمصفوفة الي الحجم الافتراضي

يتم اضافة حجم افتراضي جديد.

الغرض الرئيسي من كل هذه العمليات هي الا يتم حذف المصفوفة في كل مرة يضاف اليها عنصر ونسخها في مقطع

اخر للذاكرة (الا مرات قليلة ).

بهذه الطريقة تصبح المصفوفة اسرع بكثير.

( _ /)

(='.'=)

(")-(")

#7

هل من مثال اخ خالد على استعمال هذا النوع ؟؟؟ اريد ان اراه تحت المنقح

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#8

السلام عليكم ,,

أهلاً بالأخوة garo و GamingMasteR,,

الحقيقة أن الأخ garo قد شرح لكم العملية كاملة من طقطق للسلام عليكم :lol:

بالحديث عن STL فهي بحق تعتبر واحدة من أقوى المكتبات التي يمكن للشخص أن يثق بها B)

بعيداً عن منتجات الشركات التجارية, فيمكن اعتبار تصميم STL نفسه تحفة معمارية برمجية رائعة, و ولولا أنها كذلك لما كانت من ضمن الـ Standards الخاصة بـ ++C,

إضافة إلى ذلك فمرونتها الفائقة تمكنها من أخذ مكان الكثير من المكتبات السابقة و التجارية بكل سهولة!

أخي GamingMasteR,

الأخ garo ذكر أن عملية حجز الذاكرة لا تتم عند إضافة العناصر, و لكنها تتم وفق معيار آخر,

الحقيقة أن الطريقة المتبعة في الـ Vector الخاص بـ STL هي مضاعفة حجم المصفوفة كل مرة تمتلئ ,,

مثال على ذلك,

لو أن لدينا 4 عناصر في المصفوفة و أردنا إدخال عنصر خامس, فسيتم زيادة حجم المصفوفة لتتمكن من حمل 8 عناصر, و لو أنها امتلأت سيتم إضافة ضعف الحجم أي يصبح حجمها 16 و هكذا, و بالتالي يتم حصر عمليات حجز الذاكرة إلى ادنى عدد ممكن ,

الحقيقة أن الكود الخاص بالـ vector متوفر على النت, و يمكنك البحث عن شركة sgi التي قامت بتطوير STL,, و لكن أنا لا أحب عملية الـ debugging للـ templates لأنها ليست بتلك السهولة ابداً :wacko:

كان هناك مقال رائع في codeproject يحاكي فيه كاتب المقال الـ vector الخاص بـ STL و لكني لم أجد المقال حين بحثت عنه للأسف :(

و لكن يمكنك إنشاء كائن يمكن إضافة العناصر إليه فقط للتجربة, و اتباع طريقة حجز الذاكرة المذكورة, و قياس الوقت المستغرق في حالة الحجز العادية و الحالة التي ذكرت,,

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 14 يناير 2008 في 18:30

#9

حسنا هي تختصر الوقت على المبرمج وتحسن السرعة "بالنسبة للطرق الاخرى" :clapping:

لكن اعقد مازال الـAPI او الـNative افضل من حيث السرعة حيث ان هذه المكتبات تستخدمهم بشكل غير مباشر بعد عدة عمليات من الترتيب والاختبارات :lol:

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#10

السلام عليكم ,,

اقتباس
لكن اعقد مازال الـAPI او الـNative افضل من حيث السرعة حيث ان هذه المكتبات تستخدمهم بشكل غير مباشر بعد عدة عمليات من الترتيب والاختبارات

أعتقد أن الأمر اختلط عليك قليلاً,

API أي نظام تشغيل لا يوفر ما توفره STL, STL توفر Data structures إضافة إلى algorithms و APIs أنظمة التشغيل ليس لها علاقة بهذه الأمور, و حتى لو وفرتها أنظمة التشغيل فلن تكون بكفائة STL أو قوتها و مرونتها, و خصوصاً عند الحديث عن الـ Templates و الـ Generic Programming و هذا ما توفره STL,

حيث يمكنك استخدام أي نوع مع هذه الـ Containers دون فقدان حبة كفائة واحدة :lol: و السبب بالطبع هي الـ templates في ++C,

إضافة إلى أن هندسة STL نفسها متقدمة إلى أبعد الحدود, و سبب ظهورها أن المبرمجين في السابق كانوا يقومون بإنشاء الـ Data structure بأنفسهم و بالطبع لم تكن بالكفائة اللازمة دائماً خصوصاً عندما نتكلم عن الشركات الصغيرة أو المبرمجين كأشخاص,

إضافة إلى ذلك, STL توفر لك شيء يسمى Allocator و هذا لوحده يعتبر صيحة جديدة في عالم إدارة الذاكرة B)

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 14 يناير 2008 في 23:25

#11
اقتباس
API أي نظام تشغيل لا يوفر ما توفره STL, STL توفر Data structures إضافة إلى algorithms

كنت اتكلم عن الذاكرة وحجزها (نعم هذه المكتبة "تحجز" الذاكرة عن طريق API بشكل او اخر)

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#12

السلام عليكم ,,

اقتباس
كنت اتكلم عن الذاكرة وحجزها (نعم هذه المكتبة "تحجز" الذاكرة عن طريق API بشكل او اخر)

أنا ما راح أسيبك في حالك يا باشا :P

استخدام api مباشرة لا أنصح به بشكل عام, طبعاً بما إنك اسمبلاوي فراح تعترض قبل ما تسمع السبب :D

صحيح أن new ستستخدم دوال api في الخلفية, و لكنك باستخدام api مباشرة تنازلت عن أهم ميزة لـ ++C و C و هي الـ portability ,,

لأنك لما تترجم الكود على windows, المترجم هو اللي يحدد الدوال المستخدمة, انقل الكود على نظام linux و المترجم راح يحدد دوال الحجز و التحرير دون تغيير حرف واحد في الكود,

إضافة إلى أن فرق السرعة لن يكون في صالحك, لأن طرق الـ Optimization في المترجمات لا تخطر على بال المبرمجين المحترفين فما بالك بحالتنا :wacko:

تحياتي يا باشا :)

#13
اقتباس
أنا ما راح أسيبك في حالك يا باشا

ههههههههههه ... طالما فيه افادة فلا بأس :lol:

اقتباس
صحيح أن new ستستخدم دوال api في الخلفية, و لكنك باستخدام api مباشرة تنازلت عن أهم ميزة لـ ++C و C و هي الـ portability ,,

لأنك لما تترجم الكود على windows, المترجم هو اللي يحدد الدوال المستخدمة, انقل الكود على نظام linux و المترجم راح يحدد دوال الحجز و التحرير دون تغيير حرف واحد في الكود

معك حق ... مع ان كود لبرنامج كامل يعمل في ويندوز لن يعمل في نظام اخر لانك بشكل او اخر ستضطر الى استخدام دوال خاصة بنظام الويندوز لتحقيق غرض معين

اقتباس
إضافة إلى أن فرق السرعة لن يكون في صالحك, لأن طرق الـ Optimization في المترجمات لا تخطر على بال المبرمجين المحترفين فما بالك بحالتنا wacko.gif

لا اعتقد ذلك ... المنقح بيني وبينك :evil: , المترجم لا يعرف ماذا اريد لذلك يضيف كمية كبيرة من اكواد التحقق وووو الخ :wacko: ... لكن انا اعرف ما اريد لذلك يمكنني كتابة ما اريد بشكل مختصر بدون لف ودوران كما يفعل المترجم ... قارن بين اي برنامج مكتوب مرتين بالسي(كمثال للمترجمات الذكية) والاسمبلي(كمثال للكود بدون لف ودوران)

الملف الناتج عن الاسمبلي سيكون اكثر سرعة واقل حجما ... وأكفأ (اذا كنت تعرف ما تريد :thumb_up: )

تم تعديل هذه المشاركة بواسطة GamingMasteR في 15 يناير 2008 في 14:35

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#14

سلام ,,

اقتباس
لا اعتقد ذلك ... المنقح بيني وبينك , المترجم لا يعرف ماذا اريد لذلك يضيف كمية كبيرة من اكواد التحقق وووو الخ ... لكن انا اعرف ما اريد لذلك يمكنني كتابة ما اريد بشكل مختصر بدون لف ودوران كما يفعل المترجم ... قارن بين اي برنامج مكتوب مرتين بالسي(كمثال للمترجمات الذكية) والاسمبلي(كمثال للكود بدون لف ودوران)

الملف الناتج عن الاسمبلي سيكون اكثر سرعة واقل حجما ... وأكفأ (اذا كنت تعرف ما تريد )

أنا أتفق معاك في هذه النقطة, و خصوصاً عندما كنت أعمل على معالجات موتورلا في الجامعة, أحيانا استخدام الأسمبلي أريح من وجع راس السي,

و لكن في النهاية, عملية حجز الذاكرة و تحريرها "كعملية" ليست عملية تحتاج إلى مصادر النظام بشكل كبير, بالطبع الأهم من استخدام احدى الطريقتين اللي تكلمنا عنهم, هو التكنيك المتبع من حيث كثافة الحجز و التحرير خلال عمل البرنامج, هذا بالتأكيد سيؤدي إلى استهلاك وقت ليس بالهين! خصوصاً إذا تكررت العملية مرات عديدة,

لذلك ستجد أن هناك الكثير من طرق تسريع هذه العملية, أشهر هذه الطرق هو إنشاء pool في الذاكرة, و بعدها تحكم بالمنطقة المحجوزة و قسمها على كيفك!

تحياتي ,,

هذا الموضوع مغلق.

مواضيع مشابهة