Ukuran visual C++ dari versi debug dan rilis pada perpustakaan statis

Saya memiliki pertanyaan yang sama dengan: ukuran dll (debug dan rilis) tetapi saya ingin untuk menyelidiki hal ini lebih lanjut.

Kode saya hanyalah satu file .h 2kb dan satu file .cpp 14k. lib debug yang dihasilkan adalah 185 kb yang dibuat dengan

/GS /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /sdl /Fd"Debug\vc110.pdb" /fp:precise /D "_CRT_SECURE_NO_WARNINGS" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MTd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\lib_yyy.pch" 

versi rilis saya adalah 2275 kb

/GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"Release\vc110.pdb" /fp:precise /D "_CRT_SECURE_NO_WARNINGS" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MT /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\lib_yyy.pch" 

jadi saya mencoba mengoptimalkan ukuran alih-alih kecepatan dan mematikan ekspansi inline untuk mengantisipasi sesuatu yang mirip dengan versi debug (O1 dan Ob0, bukan O2):

/GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O1 /Ob0 /sdl /Fd"Release\vc110.pdb" /fp:precise /D "_CRT_SECURE_NO_WARNINGS" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MT /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\lib_yyy.pch" 

ukuran yang dihasilkan : 2275 kb...tunggu..apa???

jika saya melakukan header dumpbin pada versi debug, saya mendapatkan banyak sekali baris, pada versi rilis, semua ukuran muncul dalam satu paragraf kecil anonim.

jadi bagaimana cara memeriksa apa yang memakan semua ruang ini? dan bagaimana masuk akal bahwa pengoptimalan kecepatan dan ukuran memberikan ukuran yang sama dan ukuran tersebut jauh lebih besar daripada tidak dioptimalkan sama sekali DAN membawa informasi debug tambahan?


person AbsolutelyFreeWeb    schedule 16.07.2016    source sumber


Jawaban (1)


"Buat file peta" di opsi tautan adalah cara universal untuk men-debug pertanyaan "mengapa ini begitu besar", tetapi karena Anda bertanya tentang lib, itu tidak akan berhasil. Tidak banyak orang yang peduli dengan ukuran lib. Saya kira sebagian besar orang yang peduli dengan ukuran lib bingung dan seharusnya memperhatikan ukuran exe. Tapi mungkin Anda pengecualian.

Saya tidak akan membuang waktu untuk berfilsafat tentang apa yang secara teori mungkin menyebabkan codegen mode rilis menjadi lebih besar.

Kemungkinan besar penyebab masalah Anda adalah, "optimasi seluruh program" dan "pembuatan kode waktu tautan". (lihat /GL di baris perintah.) Dengan itu, file objek mode rilis pada dasarnya dipancarkan setengah jadi, jadi file tersebut tidak dibuat sekecil mungkin. Penurunan terjadi selama penautan, dan di situlah kebanyakan orang menganalisis ukuran kode mereka.

Pembangunan kembali yang minimal mungkin juga mengacaukan analisis Anda.

person zeromus    schedule 19.07.2016
comment
Terima kasih atas penjelasannya. ya saya melihat bahwa ketika saya menggunakan file lib besar saya di exe, exe sebenarnya jauh lebih kecil daripada lib - person AbsolutelyFreeWeb; 20.07.2016