C++ 这不是一个无用的内联声明吗?



这是关于内联函数的另一个问题
但我会立即接受可能的评论和答案:

  1. 在类中定义函数使其自动内联
  2. 同样的行为可以通过用inline标记函数来实现课外活动
  3. 内联函数不必内联。是的完全取决于编译器来内联它

现在,我的问题是:
内联函数意味着将主体复制到调用它的地方
如果编译器访问私有或受保护的成员,那么假设它不会内联它,这不是正确的吗
该程序实际上无法访问成员,对吗

我想知道这一点,因为对我来说,如果有人内联一个显然不能内联的函数,那看起来一定很奇怪

下面是一个例子:

//Declaration
class Controller
{
public:
    bool bHasTarget();
private:
    const Object* pTarget;
};

//Definition
inline bool Controller::bHasTarget(){
    return !(pTarget == nullptr); //<- This cannot be inlined...Can it?
}

编译器可以访问所有内容。这些限制仅对程序员有效。这意味着编译器访问任何变量都没有任何限制!最后,每个变量都被转换成一个可以访问的地址。因此,对于编译器来说,内联您提供的代码是没有问题的!

作为程序员访问私有变量也有一些"作弊"行为。例如

struct foo
{
private:
    int a;
    int b;
};
...
foo test;
int *cheat = reinterpret_cast<int*>(&test);
cheat[0] = 1;    //This would Change a
...

编译器不能内联内联函数。完全由编译器来内联它。

编译器可以内联,但可能不会。不能保证。

如果编译器访问私有或受保护的成员,那么假设它不会内联它,这不是正确的吗?

不,这样认为是不对的。访问私有或受保护的成员并不能阻止内联。

该程序实际上无法访问成员,对吗?

该程序可以访问私人和受保护的成员。无论函数是否内联,它都是一个成员。

更详细地说,在进行任何内联优化之前,编译器会检查程序是否违反了访问规则。检查通过后,访问说明符对生成的程序没有任何意义,并且不限制任何优化。

示例函数可以内联。

最新更新