我想做这样的事情:
#include <iostream>
template<typename T>
class myclass
{
T something;
public:
myclass(T something) : something{ something }
{ }
struct result
{
T value;
};
result get_result()
{
return{ something };
}
};
template<typename T>
std::ostream& operator<<(std::ostream& stream, const typename myclass<T>::result& res)
{
return stream << res.value;
}
int main()
{
myclass<int> m(0);
std::cout << m.get_result() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当我输入结果时(取决于模板化的外部类),gcc和msvc都不会找到重载的流操作符.我甚至想做什么?
我正在使用clang -> llc -> s2wasm和 来从 C 编译为 WebAssembly clang -> lld。因为没有提供 c 库,所以我编写了自己的分配器。但我不确定找到空闲内存的开始的最佳方法是什么。
lld 和 s2wasm 似乎都有内存布局:| globals | stack | free memory |。使用 s2wasm 的堆栈指针位于内存地址,使用 lld 则位于全局地址(无法从 C 访问?)。
我发现的一种方法是使用以下 hack 在 wasm 执行开始时读取堆栈指针:
int stacktop()
{
int a;
return (int)(&a+1);
}
Run Code Online (Sandbox Code Playgroud)
这将创建一个局部变量,该变量不驻留在线性内存中并获取它的地址。为了生成地址,编译器将其放入内存堆栈中。
我使用返回值作为堆的开头。有没有更优雅且面向未来的方法来查找空闲内存?