2015-04-04 20 views
6

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.

Odpowiedz

1

Jednym z rozwiązań, zaimplementowanym w wersji here, jest po prostu podział biblioteki C++ na kilka części. Przesuwając kod zajmujący się we/wy i locale do oddzielnej biblioteki, cały kod, który może działać bez tego, może uniknąć statycznego inicjatora podsystemu we/wy, co prowadzi do zależności od opisanych wyżej funkcji. Niestety, z oczywistych powodów wpłynie to również na strstream.


Aktualizacja: Od upstream commit 301e4ad (po raz pierwszy uwzględniona w wydaniu 1.30.6), biblioteki systemowe są już skompilowane jako pojedyncza *.bc pliku, ale zamiast jako *.a statycznej biblioteki, która zawiera kilka różnych obiektów. Spośród nich tylko wymagane są faktycznie łączone, co znacznie zmniejsza rozmiar kodu dla prostych spraw.