MvG*_*MvG 6 javascript c++ libc++ emscripten
我注意到,使用emscripten,即使是相对较小的C++文件也可以很快变成相当庞大的JavaScript文件.例:
#include <memory>
int main(int argc, char** argv) {
std::shared_ptr<int> sp(new int);
}
Run Code Online (Sandbox Code Playgroud)
使用像这样的命令用最近的emsdk编译它
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
Run Code Online (Sandbox Code Playgroud)
生成的文件超过400k.随着-g
抛出我可以做
grep -n '^function _' foo.js | c++filt -_
Run Code Online (Sandbox Code Playgroud)
看看我们在那里有什么样的功能.这里有些例子:
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
Run Code Online (Sandbox Code Playgroud)
我自己并没有打电话给任何人,但是所有的功能都包括在内.可能其中许多都包含在一些虚拟功能表中.其他可能是由于一些静态初始化器.
如果这是正常的代码链接到我的硬盘驱动器上的某个共享库; 我不反对.但只需要一个共享指针,就可以传输半兆字节的JavaScript代码?必须有办法避免这种情况.
此处实现的一种解决方案是将 C++ 库简单地分成几个部分。通过将处理 I/O 和语言环境的代码移至单独的库中,所有无需此库即可工作的代码都可以避免 I/O 子系统的静态初始化程序,这会导致对上述函数的依赖。不幸的是,出于显而易见的原因,这也会影响strstream
。
更新:自从上游提交 301e4ad(首次包含在版本 1.30.6 中)以来,系统库不再编译为单个*.bc
文件,而是编译为*.a
包含多个不同对象的静态库。其中,只有所需的内容才会真正链接进来,这大大减少了简单情况下的代码大小。
归档时间: |
|
查看次数: |
124 次 |
最近记录: |