Ця оптимізація відбувається завдяки, тому що 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