我正在研究一种类似 c++ 的小型语言,我将把它编译成 LLVM。我想要实现的一件事是协作式多任务处理;将有一个“yield”运算符,它有望将堆栈指针和程序计数器切换到我程序中的下一个“线程”。
是否可以在 llvm 中执行此操作?我可以设置堆栈指针寄存器吗?如果没有,我还能做其他类似的事情吗?
编辑:LLVM 协程(http://llvm.org/docs/Coroutines.html)听起来很有希望,尽管https://internals.rust-lang.org/t/llvm-coroutines-to-bring-awarness/3708/12提出了一些关于有栈或无栈协程的问题。我想知道,它们可以用来实现一个通用的类似产量的运算符吗?
编辑 2:在 C++ 中,boost 有一个叫做“上下文”的东西,它可以实现堆栈协程。仍然试图弄清楚他们是如何做到的。有人知道吗?
我想了解unique_ptr,shared_ptr和weak_ptr中随附C++ 11.
我听说这weak_ptr对于缓存,打破周期等等都会很好.我听说他们合作得很好shared_ptrs.
但在这方面,shared_ptrs和之间的区别是unique_ptrs什么?为什么weak_ptr只能与一个而不是另一个一起使用?为什么我不想对其他人拥有的东西进行弱引用?
我想尝试libuv,但我需要能够将我的网络线程中的事件发送到我的主线程.我猜libuv会有自定义事件来处理这类事情,但我找不到它们.
有任何想法吗?谢谢!
我有一个类可以输出以下任何一个:
(注意每种情况下判断的不同之处:它可以是未定义的,null或值)
该课程如下:
class Claim {
String title;
Nullable<String> judgment;
}
Run Code Online (Sandbox Code Playgroud)
和Nullable是这样的:
class Nullable<T> {
public T value;
}
Run Code Online (Sandbox Code Playgroud)
使用自定义序列化程序:
SimpleModule module = new SimpleModule("NullableSerMod", Version.unknownVersion());
module.addSerializer(Nullable.class, new JsonSerializer<Nullable>() {
@Override
public void serialize(Nullable arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException, JsonProcessingException {
if (arg0 == null)
return;
arg1.writeObject(arg0.value);
}
});
outputMapper.registerModule(module);
Run Code Online (Sandbox Code Playgroud)
简介:此设置允许我输出值,或null 或undefined.
现在,我的问题是:如何编写相应的解串器?
我想它看起来像这样:
SimpleModule module = new SimpleModule("NullableDeserMod", Version.unknownVersion());
module.addDeserializer(Nullable.class, new JsonDeserializer<Nullable<?>>() {
@Override
public Nullable<?> deserialize(JsonParser parser, DeserializationContext context) throws …Run Code Online (Sandbox Code Playgroud) 我正在研究使用OpenGL和D进行实时游戏,我担心垃圾收集器.从我听到的情况来看,这是一种可能性:
这可能很糟糕,因为它导致口吃.但是,如果我强制垃圾收集器一直运行,就像GC.collect一样,它会让我的游戏更顺畅吗?像这样:
这种方法是否真的有效并使我的帧率更加一致?我想使用D,但如果我不能使我的帧率保持一致,那么我将不得不使用C++ 11.
我意识到它可能效率不高,但重要的是它会更平滑,更稳定的帧速率.如果你知道我的意思,我宁愿平滑30 fps而不是口吃35 fps.
我正在尝试学习函数式编程zen,所以我正在编写一个使用纯函数式编程的简单编译器:Scala,在任何地方都没有'var',也没有可变结构.
我有一个"已经评估过的函数"的缓存来加速编译并避免在某些情况下无限递归.在命令式方法中,这可能是某个地方的大型可变哈希映射的引用.但在功能方法中,它更像是下面的代码(大大简化和释义,原谅任何语法错误).
def compileAdd(
cache0: Cache,
uncompiledLeftSubExpr: UncompiledExpr,
uncompiledRightSubExpr: UncompiledExpr)
: (Cache, CompiledExpr) = {
val (cache1, compiledLeftSubExpr) =
compileExpression(cache0, uncompiledLeftSubExpr)
val (cache2, compiledRightSubExpr) =
compileExpression(cache1, uncompiledRightSubExpr)
val newExpression =
AddExpression(compiledLeftSubExpr, compiledRightSubExpr)
(cache2, newExpression)
}
Run Code Online (Sandbox Code Playgroud)
但是,想象一下,如果我有一个最后一行的错误:
(cache1, newExpression)
Run Code Online (Sandbox Code Playgroud)
我做这一切的时候.这是我重构后错误的主要来源; 在移动代码后,我不可避免地忘记更新其中一个"版本号"并意外使用旧版本.
这是一个常见的错误吗?如何避免它?
我会使用do-syntax,但这让我觉得只是一个更复杂的"var".我一定在想这个错误......
如果我用 C++CLI/托管 C++ 编写程序,编译器是否会执行任何优化?
我知道对于C#来说,有一些优化是在编译时完成的,其中大多数优化是由JIT完成的。C++CLI 也是如此吗?
类似的问题:对于 C++CLI,我可以做相当于 -O2 标志的操作吗?我已经知道“-c Release”标志,但我不清楚它做了什么样的优化。
谢谢!
boost ×1
c++ ×1
c++-cli ×1
c++11 ×1
clr ×1
coroutine ×1
d ×1
frame-rate ×1
immutability ×1
jackson ×1
jit ×1
json ×1
libuv ×1
llvm ×1
llvm-clang ×1
memory-leaks ×1
monads ×1
node.js ×1
optimization ×1
real-time ×1
scala ×1