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

时间:2015-06-22 14:16:05

标签: c++ inline private member protected

这是关于内联功能的另一个问题 但我会立即采取可能的评论和答案:

  1. 在类中定义函数会使其自动内联。
  2. 通过使用内联标记函数可以实现相同的行为 在课外。
  3. 内联函数不必内联。它是 完全由编译器内联。
  4. 现在,我的问题:
    内联函数意味着将主体复制到调用它的位置。
    如果它访问私有或受保护的成员,编译器不会内联它是不是正确的?
    该程序根本无法访问成员吗?

    我想知道,因为对我来说,如果有人内联一个显然无法内联的功能,那一定看起来很奇怪。

    以下是一个示例:

    //Declaration
    class Controller
    {
    public:
        bool bHasTarget();
    
    private:
        const Object* pTarget;
    };
    
    
    //Definition
    inline bool Controller::bHasTarget(){
        return !(pTarget == nullptr); //<- This cannot be inlined...Can it?
    }
    

2 个答案:

答案 0 :(得分:1)

  

编译器可能无法内联内联函数。完全由编译器来内联它。

编译器可能内联,但可能没有。它不能保证。

  

假设编译器在访问私有或受保护成员时不会内联它是不是正确的?

不,这样假设是不对的。访问私人或受保护的成员并不妨碍内联。

  

该程序根本无法正确访问成员?

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

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

可以内联示例函数。

答案 1 :(得分:1)

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

作为程序员,访问私有变量也有一些“秘籍”。 e.g

struct foo
{
private:
    int a;
    int b;
};

...
foo test;
int *cheat = reinterpret_cast<int*>(&test);
cheat[0] = 1;    //This would Change a
...