سؤال

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

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

المحلول

يمكن أن يكون هناك عدة أسباب عند الكائن ملفات أكبر من أنها يجب أن تكون في الحد الأدنى:

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

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

نصائح أخرى

و(أفترض أنك قد حصلت تحقيق أمثلية ورمز ميت تجريد قيد التشغيل).

تشغيل خيار رابط الخاص بك "توليد ملف خريطة" ودراسة الإخراج.

والجناة الشائعة هي وحدات الماكرو / القوالب التي تنتج كميات كبيرة من التعليمات البرمجية، والأشياء العالمية الكبيرة.

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

تحديث: يمكن أن يكون أيضا بعض كبير ثابت مجموعة / الكائن. وبالاضافة الى ذلك، مع MSVC ++ ودول مجلس التعاون الخليجي، يمكنك أن تبحث في الجمعية إنشاؤها للملف، التي يمكن أن تعطيك بعض التلميحات (مع دول مجلس التعاون الخليجي، انها g++ -S foo.cpp، لMSVC ++، انها <لأ href = "http://msdn.microsoft.com /en-us/library/367y26c6.aspx "يختلط =" نوفولو noreferrer ">" / اتفاقات الصيد "). إما سترى الكثير من الحالات القالب، ثم هذه هي السبب. إذا لم يكن كذلك، فإنه من حجم جسم من الأجسام static.

والسبب المحتمل الآخر هو ارتباط في الوقت كود Generation، وهي الخيار VC ++. هذه التحركات الخلفية للمجمع في رابط. وهذا يسمح لتحسينات أفضل، لكن ملف الكائن لديها الآن لاحتواء كل datastructures الداخلية مرت عادة بين الأمامية والخلفية.

وهنا ماكرو يمكنني استخدام لرؤية تجميع قيم الوقت:

template <size_t N> struct compile_time_number { private: typedef int check; };
#define compiler_check_number(N) ((compile_time_number< N >::check)0)

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

وتحرير: منذ يبدو أن لا أحد يفهم هذا، وأنا سوف توضيح: في طريقة لاستخدام هذا هو لإضافة compiler_check_number(sizeof(<insert struct or global variable here>)). فإن المترجم بصق حجم متغير أو البنية كخطأ وقت الترجمة. نادرا جدا ما هو رمز سبب ملف الكائن الضخم.

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

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