我一直试图弄清楚LLVM的指令组合代码并注意到这个功能:
static void detectLog2OfHalf(Value *&Op, Value *&Y, IntrinsicInst *&Log2) {
if (!Op->hasOneUse())
return;
IntrinsicInst *II = dyn_cast<IntrinsicInst>(Op);
if (!II)
return;
if (II->getIntrinsicID() != Intrinsic::log2 || !II->hasUnsafeAlgebra())
return;
Log2 = II;
Value *OpLog2Of = II->getArgOperand(0);
if (!OpLog2Of->hasOneUse())
return;
Instruction *I = dyn_cast<Instruction>(OpLog2Of);
if (!I)
return;
if (I->getOpcode() != Instruction::FMul || !I->hasUnsafeAlgebra())
return;
if (match(I->getOperand(0), m_SpecificFP(0.5)))
Y = I->getOperand(1);
else if (match(I->getOperand(1), m_SpecificFP(0.5)))
Y = I->getOperand(0);
}
为什么*&
会在参数中使用?它是否具有某种含义或Op
是否等同于*&Op
?
答案 0 :(得分:2)
为什么*&amp;用于参数?
在函数参数列表中,此参数
IntrinsicInst *&Log2
是对Value
指针的引用。这意味着该函数可以修改指针本身,这可以在调用者端看到。在这种情况下,这发生在这里:
Log2 = II;
如果Log2
未通过引用传递,则上述行只会对函数范围产生影响。
...... Op会等同于*&amp; Op?
不在此背景下。在另一个,是的。例如,当*
是取消引用运算符且&
是地址运算符时,则*&x
将意味着“取消引用应用地址运算符的结果x
“,即取消引用指向x
的指针。 C ++根据上下文混淆地重复使用符号。其中大部分都是从C继承的。最重要的是,对C ++的更改不应该破坏现有代码。最简单的方法是重复使用符号。
答案 1 :(得分:1)
&
表示参考。
value *
表示value
是指针。
value *&op
与通过引用传递指针是一致的,所以如果我们在函数中更改value
,它将反映在被调用函数中。