为什么*¶m会在函数中使用?

时间:2014-04-03 06:30:05

标签: c++ parameters llvm

我一直试图弄清楚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

2 个答案:

答案 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,它将反映在被调用函数中。