当async方法缺少任何await运算符时,C#编译器会生成CS1998警告.
警告背后的原因是什么?
我知道async通过添加状态机和异常处理来引入方法的开销.
警告性能的主要原因是什么?或者有理由通知我,我可能已经忘记了await某个地方?
也许来自语言设计团队的人可以对这一个有所了解...... :)
(请:不要发布说'你可以删除async以使警告消失'的答案.我想知道警告背后的原因和决定,而不是解决问题的方法.)
我正在尝试为LLVM 3.2优化器构建一个传递,我需要一个支配树.通过DominatorTree从PassManager 请求分析结果,这很容易实现,但即使这个简单的例子也会崩溃.
我究竟做错了什么?
namespace {
struct Mypass : public FunctionPass {
static char ID;
Mypass() : FunctionPass(ID) { }
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<DominatorTree>();
}
virtual bool runOnFunction(Function &F) {
DominatorTree& DT = getAnalysis<DominatorTree>(F);
return false;
}
};
}
char Mypass::ID = 0;
static RegisterPass<Mypass> X("mypass", "My test analysis", true, true);
Run Code Online (Sandbox Code Playgroud)
什么时候打电话
opt --load mypass.so -mypass --debug-pass=Structure test.bc
它立即与segfaults
Pass Arguments: -targetlibinfo -datalayout -domtree -mypass -preverify -domtree -verify
Target Library Information
Data Layout
ModulePass Manager …Run Code Online (Sandbox Code Playgroud) LLVM有一个SelectInst用于表示表达式的表达式something = cond ? true-part : false-part.
这条指令在IR中有什么好处,编译器?:也可以一直降低到a BranchInst?是否有支持此类指令的CPU?或者select降级为CodeGenerator的跳转?
我认为分析传递可能有好处,因为它select保证了隐含的两个"分支" if.但另一方面,编译器根本不需要使用该指令,因此这些通道必须能够处理brs.