这是关于内联功能的另一个问题 但我会立即采取可能的评论和答案:
现在,我的问题:
内联函数意味着将主体复制到调用它的位置。
如果它访问私有或受保护的成员,编译器不会内联它是不是正确的?
该程序根本无法访问成员吗?
我想知道,因为对我来说,如果有人内联一个显然无法内联的功能,那一定看起来很奇怪。
以下是一个示例:
//Declaration
class Controller
{
public:
bool bHasTarget();
private:
const Object* pTarget;
};
//Definition
inline bool Controller::bHasTarget(){
return !(pTarget == nullptr); //<- This cannot be inlined...Can it?
}
答案 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
...