سؤال

هناك العديد من المآخذ على استخدام void * في ج (الذاكرة ذات الصلة ، نوع ذات الكفاءة الحكمة ...).على الرغم من استخدامها الكثير من المرونة التي توفرها.

قائمة مساوئ/عيوب استخدام void * (و يفضل حل في C - إذا كان ذلك ممكنا).

تحرير: يرجى الدخول من خلال follwoing الرابط:http://attractivechaos.wordpress.com/2008/10/02/using-void-in-generic-c-programming-may-be-inefficient/

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

المحلول

لا توجد كفاءة القضايا مع الفراغ المؤشرات.القيود الوحيدة مع الفراغ مؤشرات هي:

  • لا يمكنك إلغاء مرجعية الفراغ مؤشر لأسباب واضحة
  • sizeof(void) هو غير قانوني
  • لا يمكنك أداء مؤشر الحساب على الفراغ المؤشرات

ومع ذلك دول مجلس التعاون الخليجي يفترض أن sizeof(void) 1 ويسمح مؤشر الحساب على الفراغ المؤشرات - انظر هنا

نصائح أخرى

أنا أختلف مع فرضية السؤال.نحن نستخدم الفراغ* في ج لأن ذلك هو السبيل الوحيد للحصول على تعدد الأشكال.على سبيل المثال:وظائف مكتبة qsort و bsearch.هناك عيب واحد فقط, وهو أن تعدد الأشكال على أساس باطل * غير آمنة:بمجرد أن يلقي مؤشر إلى الفراغ * لا يوجد شيء يمنعك من صب هذا الفراغ * إلى الخطأ نوع المؤشر عن طريق الخطأ.طلابي تجعل هذا الخطأ في كثير من الأحيان.

يمكن أن يكون هناك كفاءة التكلفة لأنه من الضروري في بعض الأحيان إلى تخصيص مساحة الكومة من أجل استخدام متعدد الأشكال بنية البيانات.

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

اه ...أنا لست متأكدا من أن هناك العديد من.بالطبع يجب عدم استخدام void* عندما لم يكن لديك إلى.إذا كان هناك واضحة المعالم نوع يمكنك استخدام ، ثم فعل ذلك.

في تجربتي ، void* هو أفضل "مجهول" مؤشرات (ما صدمة!), كما في malloc()'s قيمة الإرجاع ، وعندما تتعامل مع مبهمة مخازن من البتات.في كثير من الأحيان ، تريد معالجة هذه المخازن المؤقتة في مثلبايت مستوى ، ومن ثم استخدام unsigned char *, بالطبع.

فقط عشوائيا باستخدام void* أينما كنت في حاجة المؤشر سيكون مجرد كسر ، رائحة كريهة رمز ، ينبغي تجنبها بالطبع.

مرتبط-إلى آخر يقارن العمليات مع الفراغ مؤشرات العمليات مع C++ قوالب, ويخلص إلى أن القوالب هي أكثر كفاءة.هذا ليس مفاجأة ، C++ code رأيت يستخدم الفراغ مؤشرات نادرا أو أبدا.عادة لا تقدم أي ميزة على غيرها من C++ المرافق ، ويمكن أن تكون فجوة في نوع النظام.

ومع ذلك, C لا يكون C++على غرار قوالب, وباطلة المؤشرات اللازمة لتنفيذ الوظائف التي يجب أن تكون مستقلة من نوع البيانات.

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

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

الخيار الأول هو سيء لأنه ليس المحمولة ، 0s ربما لا يسمح كقيمة و ذلك ببساطة يشعر سيئة.الخيار الثاني النفايات الذاكرة هو في الواقع (ضخمة) تبطئ بسبب مخصصات إضافية.

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

لكن لاحظ أن هذا هو كل شيء عن حاوية تطبيقات مثل btw بلوق المادة المذكورة.بشكل عام هناك العديد من الأشياء التي لا يمكن تحقيقه دون استخدام الفراغ رميات.

لا أعلم, لقد وجدت الفراغ المؤشرات أن تكون فعالة جدا من أجل الوصول إلى مستويات مختلفة من التجريد (أبجديات).كوسيلة التنقل مترابطة دروس في مستويات مختلفة من التجريد.دورته بسيطة جدا, رهيبة.مثل صيغة e أو النسبة الذهبية, يجب أن يكون هناك الغيبيات التي يعبد الفراغ* به ذلك العظيم :)

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