Zauważam, że z emscripten nawet stosunkowo małe pliki C++ mogą szybko zostać przekształcone w dość duże pliki JavaScript. Przykład:Pomiń niektóre podsystemy C++
#include <memory>
int main(int argc, char** argv) {
std::shared_ptr<int> sp(new int);
}
gromadzi te z aktualnym emsdk pomocą polecenia jak
em++ -std=c++11 -s DISABLE_EXCEPTION_CATCHING=1 -s NO_FILESYSTEM=1 \
-s NO_BROWSER=1 -s NO_EXIT_RUNTIME=1 -O3 -o foo.js foo.cc
plik wynikowy jest na 400K duży. Z -g
wrzucony mogę zrobić
grep -n '^function _' foo.js | c++filt -_
i zobaczyć, jakie funkcje mamy tam. Oto kilka przykładów:
std::__1::moneypunct<char, false>::do_thousands_sep() const
std::__1::locale::~locale()
std::__1::basic_string<wchar_t, …>::~basic_string()
std::__1::time_get<…>::__get_day(…) const
std::__1::codecvt<wchar_t, char, __mbstate_t>::codecvt(unsigned int)
std::__1::locale::__imp::install(std::__1::locale::facet*, long)
_printf_core
Nie wywołuję tego samemu, ale mimo to wszystkie funkcje są uwzględniane. Prawdopodobnie wiele z nich znajduje się w niektórych tabelach funkcji wirtualnych. Inne mogą być spowodowane statycznym inicjatorem.
Jeśli był to normalny kod połączony z pojedynczą wspólną biblioteką gdzieś na moim dysku twardym; Nie protestowałbym. Ale pół megabajtowego kodu JavaScript do przesłania, tylko dla jednego wspólnego wskaźnika? Musi być sposób na uniknięcie tego.