2015-04-04 5 views
6

छोड़ दें मुझे लगता है कि ईएमएसस्क्रिप्ट के साथ, अपेक्षाकृत छोटी सी ++ फ़ाइलों को भी बड़ी जावास्क्रिप्ट फ़ाइलों में जल्दी से बदल दिया जा सकता है। उदाहरण:कुछ सी ++ उपप्रणाली

#include <memory> 
int main(int argc, char** argv) { 
    std::shared_ptr<int> sp(new int); 
} 

तरह

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 

परिणामी फ़ाइल 400K बड़ा खत्म हो गया है एक आदेश का उपयोग हाल ही में एक emsdk के साथ इस संकलित करें। -g मैं में फेंक दिया

grep -n '^function _' foo.js | c++filt -_ 

करने और देखने कार्यों किस प्रकार हम देखते है कर सकते हैं। यहां कुछ उदाहरण दिए गए हैं:

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 

मैं इनमें से किसी को भी नहीं बुला रहा हूं, लेकिन फिर भी सभी कार्यों को शामिल किया जा रहा है। शायद उनमें से कई वर्चुअल फ़ंक्शन टेबल में शामिल हैं। अन्य कुछ स्थिर प्रारंभकर्ता के कारण हो सकते हैं।

यदि यह मेरे एचडीडी पर कहीं भी एक साझा लाइब्रेरी के खिलाफ सामान्य कोड जुड़ा हुआ था; मैं ऑब्जेक्ट नहीं करता। लेकिन जावास्क्रिप्ट कोड में आधे मेगाबाइट को स्थानांतरित करने के लिए, केवल एक साझा पॉइंटर के लिए? इससे बचने के लिए एक रास्ता होना चाहिए।

उत्तर

1

एक समाधान, here लागू किया गया, बस कई हिस्सों में सी ++ लाइब्रेरी को विभाजित कर रहा है। आई/ओ और लोकेल से अलग कोड में कोड को ले जाकर, सभी कोड जो इसके बिना काम कर सकते हैं I/O उपप्रणाली के स्थिर प्रारंभकर्ता से बच सकते हैं जो ऊपर वर्णित कार्यों पर निर्भरता का कारण बनता है। दुर्भाग्यवश यह स्पष्ट कारणों से strstream को भी प्रभावित करेगा।


अद्यतन: के बाद से नदी के ऊपर commit 301e4ad (पहली रिलीज 1.30.6 में शामिल है), प्रणाली पुस्तकालयों नहीं रह गया है एक भी *.bc फ़ाइल के रूप में संकलित किया गया है, लेकिन बजाय एक *.a स्थिर पुस्तकालय जो कई अलग ऑब्जेक्ट्स के रूप में। इनमें से केवल आवश्यक लोगों को वास्तव में लिंक किया जाता है, जो साधारण मामलों के लिए कोड आकार को बहुत कम करता है।

संबंधित मुद्दे