这是关于内联函数的另一个问题
但我会立即接受可能的评论和答案:
- 在类中定义函数使其自动内联
- 同样的行为可以通过用inline标记函数来实现课外活动
- 内联函数不必内联。是的完全取决于编译器来内联它
现在,我的问题是:
内联函数意味着将主体复制到调用它的地方
如果编译器访问私有或受保护的成员,那么假设它不会内联它,这不是正确的吗
该程序实际上无法访问成员,对吗
我想知道这一点,因为对我来说,如果有人内联一个显然不能内联的函数,那看起来一定很奇怪
下面是一个例子:
//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
...
编译器不能内联内联函数。完全由编译器来内联它。
编译器可以内联,但可能不会。不能保证。
如果编译器访问私有或受保护的成员,那么假设它不会内联它,这不是正确的吗?
不,这样认为是不对的。访问私有或受保护的成员并不能阻止内联。
该程序实际上无法访问成员,对吗?
该程序可以访问私人和受保护的成员。无论函数是否内联,它都是一个成员。
更详细地说,在进行任何内联优化之前,编译器会检查程序是否违反了访问规则。检查通过后,访问说明符对生成的程序没有任何意义,并且不限制任何优化。
示例函数可以内联。