小编Ver*_*gon的帖子

我可以在 LLVM 中设置堆栈指针吗?

我正在研究一种类似 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 有一个叫做“上下文”的东西,它可以实现堆栈协程。仍然试图弄清楚他们是如何做到的。有人知道吗?

llvm coroutine llvm-clang boost-context

5
推荐指数
1
解决办法
713
查看次数

用于将weak_ptr应用于unique_ptr的内容

我想了解unique_ptr,shared_ptrweak_ptr中随附C++ 11.

我听说这weak_ptr对于缓存,打破周期等等都会很好.我听说他们合作得很好shared_ptrs.

但在这方面,shared_ptrs和之间的区别是unique_ptrs什么?为什么weak_ptr只能与一个而不是另一个一起使用?为什么我不想对其他人拥有的东西进行弱引用?

c++ boost memory-leaks memory-management c++11

4
推荐指数
1
解决办法
3485
查看次数

我可以用libuv做自定义事件吗?

我想尝试libuv,但我需要能够将我的网络线程中的事件发送到我的主线程.我猜libuv会有自定义事件来处理这类事情,但我找不到它们.

有任何想法吗?谢谢!

node.js libuv

4
推荐指数
1
解决办法
1500
查看次数

我如何专门与杰克逊反序列化'null'?

我有一个类可以输出以下任何一个:

  • {title:"我的主张"}
  • {title:"我的主张",判决:null}
  • {title:"我的主张",判断:"站立"}

(注意每种情况下判断的不同之处:它可以是未定义的,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)

json jackson

4
推荐指数
1
解决办法
9097
查看次数

可以调用core.memory的GC.collect来保持更一致的帧速率吗?

我正在研究使用OpenGL和D进行实时游戏,我担心垃圾收集器.从我听到的情况来看,这是一种可能性:

  • 运行10帧
  • 垃圾收集器自动运行并运行10毫秒
  • 运行10帧
  • 垃圾收集器自动运行并运行10毫秒
  • 运行10帧
  • 等等

这可能很糟糕,因为它导致口吃.但是,如果我强制垃圾收集器一直运行,就像GC.collect一样,它会让我的游戏更顺畅吗?像这样:

  • 1帧运行
  • 垃圾收集器运行1-2ms
  • 1帧运行
  • 垃圾收集器运行1-2ms
  • 1帧运行
  • 等等

这种方法是否真的有效并使我的帧率更加一致?我想使用D,但如果我不能使我的帧率保持一致,那么我将不得不使用C++ 11.

我意识到它可能效率不高,但重要的是它会更平滑,更稳定的帧速率.如果你知道我的意思,我宁愿平滑30 fps而不是口吃35 fps.

garbage-collection d frame-rate real-time

3
推荐指数
1
解决办法
113
查看次数

如何避免使用错误版本数据的错误?

我正在尝试学习函数式编程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".我一定在想这个错误......

monads functional-programming scala immutability

3
推荐指数
1
解决办法
74
查看次数

C++CLI 是否经过优化?

如果我用 C++CLI/托管 C++ 编写程序,编译器是否会执行任何优化?

我知道对于C#来说,有一些优化是在编译时完成的,其中大多数优化是由JIT完成的。C++CLI 也是如此吗?

类似的问题:对于 C++CLI,我可以做相当于 -O2 标志的操作吗?我已经知道“-c Release”标志,但我不清楚它做了什么样的优化。

谢谢!

clr optimization jit c++-cli

2
推荐指数
1
解决办法
533
查看次数