在官方教程Haskell in 5 steps中,有一个导入库的示例:
\n\nimport Control.Parallel\nRun Code Online (Sandbox Code Playgroud)\n\n然后我使用 ghc 进行编译:
\n\nghc parallel.hs -o parallel -O2 --make -threaded -rtsopts\nRun Code Online (Sandbox Code Playgroud)\n\n正如教程告诉我的那样。(我的文件名是parallel.hs)但是我得到:
\n\nparallel.hs:1:1: error:\nCould not find module \xe2\x80\x98Control.Parallel\xe2\x80\x99\nUse -v to see a list of the files searched for.\n |\n1 | import Control.Parallel\n | ^^^^^^^^^^^^^^^^^^^^^^^\nRun Code Online (Sandbox Code Playgroud)\n\n然后我 stackoverflowed 并找到了这个问题。所以我:
\n\ncabal new-install parallel --lib\nRun Code Online (Sandbox Code Playgroud)\n\n并得到:
\n\nResolving dependencies...\nUp to date \nRun Code Online (Sandbox Code Playgroud)\n\n然后我再次编译,但得到了同样的错误。\n如何解决这个问题?我错过了任何命令行参数吗?
\n\n好了cabal install parallel,库导入之后,程序编译成功,并按预期运行。
我将参考 cabal 的文档了解install …
这个问题不是关于 C++20 中的协程,而是关于一般的协程。
这几天我正在学习C++20协程。我从协程简介中了解了堆栈协程和无堆栈协程。我还索取了更多信息。
以下是我对无堆栈协程的理解:
无堆栈协程在运行时在调用者的堆栈上确实有堆栈。
当它自行挂起时,由于无堆栈协程只能挂在顶层函数,因此它的堆栈是可预测的,并且有用的数据存储在某个区域中。
当它不运行时,它没有堆栈。它与一个句柄绑定,客户端可以通过该句柄恢复协程。
operator new协程 TS 指定为协程帧分配存储时调用非数组。然而,我认为这是没有必要的,因此我的问题。
一些解释/考虑:
协程的状态应该放在哪里?在句柄中,原来存储的是指针。
动态分配并不意味着存储在堆上。但我的目的是消除对 的调用operator new,无论它是如何实现的。
来自cppreference:
如果满足以下条件,则可以优化对operator new 的调用(即使使用自定义分配器):
协程状态的生命周期严格嵌套在调用者的生命周期内,并且
协程框架的大小在调用站点是已知的
对于第一个要求,如果协程比调用者寿命更长,则将状态直接存储在句柄中仍然可以。
另一方面,如果调用者不知道大小,它如何编写调用的参数operator new?事实上,我什至无法想象在什么情况下调用者不知道尺寸。
根据这个问题,Rust 似乎有不同的实现。
我认为具有通用引用参数的构造函数比没有引用的构造函数具有更好的性能。
From cppreference (https://en.cppreference.com/w/cpp/utility/functional/function/function), we can see that the template constructor for std::function is not using reference.
template< class F > function( F f );
Run Code Online (Sandbox Code Playgroud)
Is it a mistake? If not, why the standard doesn't requires the constructor use universal reference?
EDIT:
Let's think about two cases.
Using universal reference:
lvalue case: 4 bytes are copied.
rvalue case: 4 bytes are copied. (Will you …