Ця оптимізація відбувається завдяки, тому що C++, на відміну від Go і Rust, привʼязує свою стандартну бібліотеку динамічно. Через це знижується сумісність бінарних файлів. Зібраний бінарний файл на Arch з використанням GCC 13, на Debian не запускається, тому що у ньому ще досі 12 версія компілятора, відповідно і старіша версія бібліотеки libstdc++.

Мені стало цікаво скільки буде займати місця файл програми коли ми прилінкуємо цю бібліотеку статично. Це можна зробити додавши -static до команди лінкера. Збирати будемо у режимі випуску. Якщо ми привʼяжемо динамічно, то розмір буде 547.664KiB, а якщо статично, то 3.214MiB. Ми можемо зменшити обидва ці файли видаливши з них зайву інформацію за допомоги команди strip з набору binutils. Після цього перший файл буде займати 427.664KiB, а зі статичною бібліотекою 2.581MiB. У другому випадку різниця більш помітна.

Виходить що коли поставити C++ і Go у рівні умови, то по розміру виграє Go через меншу стандартну бібліотеку. А по швидкості виконання все рівно виграє C++. Але їх обох обганяє чистий C.

Також хочу замітити що на бінарний файл мови Go команда strip ніяк не впливає, тобто нічого не видаляє.

#strip #static #libstdc++ #c++ #cpp #binutils #bin #gcc #g++ #link #sof #size #статична #бібліотека #привʼязка #лінкер #лінкування #розмір #бінарники #go

Social.Net.Ua