تحديد مساهمة ملفات الرأس المضمنة في حجم الملف الإجمالي

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

سؤال

أنا مهتم بتقليل حجم ملف طلبي. إنه تطبيق MFC / C ++ الذي تم بناؤه باستخدام MVC ++ في Visual Studio 2008. يقوم UPX بعمل جيد في الحد من EXE النهائي إلى حوالي 40٪ من حجمها الأصلي ولكني أود أن أقلله أكثر.

يجب أن تكون MFC مرتبطة قانونيا في هذا المشروع.

لقد جربت بعض الأساليب المبينة في هذا السؤال: تقليل ويندوز-القابل للتنفيذ. وبعد تطبيق إعدادات مختلفة على وجه التحديد إلى برنامج التحويل البرمجي / رابط.

أعتقد أنني أستطيع تقليل حجم أكثر من خلال إلقاء نظرة على "تكلفة" بما في ذلك بعض الرؤوس في المشروع.

أي نصيحة حول كيفية الذهاب حول هذا، وربما أداة يمكن أن تحلل الشفوف لي؟ شكرًا

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

المحلول

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

نصائح أخرى

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

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

على سبيل المثال، افترض رمز ل std::list<T>::size. وبعد قد يتم استخدامه في العديد من وحدات الترجمة. ومع ذلك، فإن الرابط سوف يضع العديد من النسخ معا، وفي بعض الأحيان حتى بالنسبة لأنواع مختلفة T. ولكن كيف ستحصل على البايت الناتج في الخارج؟

الآن، إذا لم تتمكن حتى تحديد كيفية حساب بايت من الوظائف البسيطة (مجموعة من) بسيطة، فماذا ستحصل على بنيات أكثر تعقيدا؟ وإذا كنت لا تستطيع تخصيص البايتات المستخدمة في الملفات القابلة للتنفيذ إلى ملفات المصدر غير المنفذة، فلن تتمكن من تحديد المساهمات الفردية.

عادة ما تحتوي الرؤوس فقط على:

  1. وحدات الماكرو
  2. اكتب التعاريف (مثل الفصول)
  3. إعلان إعادة توجيه الوظيفة (تعريف الوظيفة موجود في ملف .c / .cpp)

لا ينتج أي مما سبق فعليا في إنشاء رمز الجهاز ما لم يتم استخدامه بالفعل من قبل التعليمات البرمجية في ملفاتك .c /.cpp.

الآن يجب تحليل كل ما سبق أعلاه (مما يضيف إلى تجميع الوقت) ولكن سيتم تجاهله ما لم يستخدم فعلا.

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

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

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

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