WebAssembly 不能编译简单 类?
WebAssembly cant compile simple classes?
我一直在使用 WebAssembly Explorer 来适应一般概念,我相信我得到了错误的输出:
C++ 代码:
class Rectangle {
void draw(int fooBar) {};
};
webassembly 的输出:
(module
(table 0 anyfunc)
(memory [=12=] 1)
(export "memory" (memory [=12=]))
)
老实说,这看起来不对。为什么不显示功能?我实际上希望资源管理器导出一个可能看起来像这样的函数:
(export "_Z4drawi" (func $_Z4drawi))
(func $_Z4drawi (param [=13=] i32)
然而它却假装对象是空的...这是为什么呢?
LLVM 正在删除您的函数,因为它未被使用。
尝试使用它并使其成为非内联的(以防止它也被淘汰):
class Rectangle {
public:
Rectangle() {}
__attribute__((noinline)) void draw(int fooBar) {}
};
int main() {
Rectangle r;
r.draw(42);
}
你得到:
(module
(table 0 anyfunc)
(memory [=11=] 1)
(export "memory" (memory [=11=]))
(export "main" (func $main))
(func $main (result i32)
(local [=11=] i32)
(i32.store offset=4
(i32.const 0)
(tee_local [=11=]
(i32.sub
(i32.load offset=4
(i32.const 0)
)
(i32.const 16)
)
)
)
(call $_ZN9Rectangle4drawEi
(i32.add
(get_local [=11=])
(i32.const 8)
)
(i32.const 42)
)
(i32.store offset=4
(i32.const 0)
(i32.add
(get_local [=11=])
(i32.const 16)
)
)
(i32.const 0)
)
(func $_ZN9Rectangle4drawEi (param [=11=] i32) (param i32)
)
)
使用 no-inline 是一种绕过优化琐碎代码的方法。您也可以将其标记为已使用:
class Rectangle {
public:
Rectangle() {}
__attribute__((used)) void draw(int fooBar) {}
};
然后你会得到:
(module
(table 0 anyfunc)
(memory [=13=] 1)
(export "memory" (memory [=13=]))
(func $_ZN9Rectangle4drawEi (param [=13=] i32) (param i32)
)
)
我一直在使用 WebAssembly Explorer 来适应一般概念,我相信我得到了错误的输出:
C++ 代码:
class Rectangle {
void draw(int fooBar) {};
};
webassembly 的输出:
(module
(table 0 anyfunc)
(memory [=12=] 1)
(export "memory" (memory [=12=]))
)
老实说,这看起来不对。为什么不显示功能?我实际上希望资源管理器导出一个可能看起来像这样的函数:
(export "_Z4drawi" (func $_Z4drawi))
(func $_Z4drawi (param [=13=] i32)
然而它却假装对象是空的...这是为什么呢?
LLVM 正在删除您的函数,因为它未被使用。
尝试使用它并使其成为非内联的(以防止它也被淘汰):
class Rectangle {
public:
Rectangle() {}
__attribute__((noinline)) void draw(int fooBar) {}
};
int main() {
Rectangle r;
r.draw(42);
}
你得到:
(module
(table 0 anyfunc)
(memory [=11=] 1)
(export "memory" (memory [=11=]))
(export "main" (func $main))
(func $main (result i32)
(local [=11=] i32)
(i32.store offset=4
(i32.const 0)
(tee_local [=11=]
(i32.sub
(i32.load offset=4
(i32.const 0)
)
(i32.const 16)
)
)
)
(call $_ZN9Rectangle4drawEi
(i32.add
(get_local [=11=])
(i32.const 8)
)
(i32.const 42)
)
(i32.store offset=4
(i32.const 0)
(i32.add
(get_local [=11=])
(i32.const 16)
)
)
(i32.const 0)
)
(func $_ZN9Rectangle4drawEi (param [=11=] i32) (param i32)
)
)
使用 no-inline 是一种绕过优化琐碎代码的方法。您也可以将其标记为已使用:
class Rectangle {
public:
Rectangle() {}
__attribute__((used)) void draw(int fooBar) {}
};
然后你会得到:
(module
(table 0 anyfunc)
(memory [=13=] 1)
(export "memory" (memory [=13=]))
(func $_ZN9Rectangle4drawEi (param [=13=] i32) (param i32)
)
)