什么是c ++ 20中的协同程序?
它与"Parallelism2"或/和"Concurrency2"的不同之处(见下图)?
以下图片来自ISOCPP.
使用 C++20,我们现在可以在 cppreference 中更频繁地阅读术语“niebloid”。
在 SO 上,我们今天可以找到 2020/07/16 2 篇提到它的文章:
谷歌也没有吐出那么多结果。最突出的也许是这里。
有人可以更多地了解 niebloids 吗?
在 C++20 中,我们现在能够将auto关键字限制为仅属于特定类型。因此,如果我有一些如下所示的代码,没有任何限制:
auto something(){
return 1;
}
int main(){
const auto x = something();
return x;
}
Run Code Online (Sandbox Code Playgroud)
这里的变量x被推导为一个int。然而,随着 C++20 的引入,我们现在可以将 约束auto为某种类型,如下所示:
std::integral auto something(){
return 0;
}
int main(){
const auto x = something();
return x;
}
Run Code Online (Sandbox Code Playgroud)
这不是违背了来这里的目的吗auto?如果我真的需要一个std::integral数据类型,我不能完全省略吗auto?我是否完全误解了使用auto?
这段代码在 C++20(使用 gcc 10.1)中编译,typename在依赖类型之前没有使用关键字std::vector<T>::iterator。为什么要编译?
#include <vector>
template<typename T>
std::vector<T>::iterator // Why does this not require "typename" before it?
f() { return {}; }
int main() {
auto fptr = &f<int>;
}
Run Code Online (Sandbox Code Playgroud)
std::bit_width发现代表整数所需的最小比特x作为1+floor(log(x))
为什么std::bit_width值 0 返回 0?它不应该返回 1,因为表示 0 所需的位数是 1?
另外,我认为1公式中的 是一个偏移量。
C ++ 20 引入了“销毁operator delete”:operator delete采用标记类型std::destroying_delete_t参数的新重载。
这到底是什么,什么时候有用?
基于以下内容,C ++ 20中的协程看起来像是无堆栈的。
https://en.cppreference.com/w/cpp/language/coroutines
我担心的原因有很多:
使用无堆栈协程时,只有顶层例程可以被挂起。该顶级例程调用的任何例程本身都不会暂停。这禁止在通用库中的例程中提供挂起/恢复操作。
由于需要自定义分配器和内存池,因此代码更加详细。
如果任务等待操作系统为它分配一些内存(没有内存池),则速度较慢。
鉴于这些原因,我真的希望我对当前的协程是错误的。
问题分为三个部分:
协程状态是通过非数组运算符new在堆上分配的。 https://en.cppreference.com/w/cpp/language/coroutines
编辑:
我现在正在为协程进行cppcon讨论,如果我对自己的问题有任何答案,我将其发布(到目前为止没有任何内容)。
CppCon 2014:Gor Nishanov“等待2.0:无堆栈可恢复函数”
https://www.youtube.com/watch?v=KUhSjfSbINE
CppCon 2016:James McNellis“ C ++协程简介”
在C ++ 17中,此代码是非法的:
constexpr int foo(int i) {
return std::integral_constant<int, i>::value;
}
Run Code Online (Sandbox Code Playgroud)
这是因为即使foo可以在编译时进行评估,编译器仍然需要产生指令以在运行时执行它,从而使模板实例化成为不可能。
在C ++ 20中,我们将具有consteval需要在编译时评估的函数,因此应删除运行时约束。这是否意味着该代码将是合法的?
consteval int foo(int i) {
return std::integral_constant<int, i>::value;
}
Run Code Online (Sandbox Code Playgroud) 已经有两个支持C++模块的编译器:
现在开始一个新项目时,为了能够在我的编译器最终发布时采用模块功能,我应该注意什么?
是否可以使用模块并仍然保持与不支持它的旧编译器的兼容性?
根据cppreference,operator!=许多标准库类型的 ,包括std::unordered_map::operator!=和在 C++20 中std::unordered_set::operator!=被删除。
委员会做出该决定的理由是什么?这不会使比较支持不对称吗?
c++ deprecated c++-standard-library comparison-operators c++20
c++ ×10
c++20 ×10
asynchronous ×1
auto ×1
c++-concepts ×1
c++-modules ×1
constexpr ×1
coroutine ×1
deprecated ×1
destroy ×1
destructor ×1
future-proof ×1
templates ×1
typename ×1