编译器是否将简单的getter方法优化为简单的字段访问?

Qix*_*Qix 3 c++ methods getter compiler-optimization visual-c++

虽然我认为在VC++中这不是一件容易的事情,但仍然值得一提.

当为返回受保护/私有成员的值的类创建getter方法时,编译器是否优化了此调用,因此它等同于引用该成员而不必使该类成为朋友并且没有完整方法调用的开销?

GMa*_*ckG 8

是.两种变体都编译成相同的东西:

struct test
{
    int x;

    int get() const { return x; }
};

__declspec(noinline) int use_x(const test& t)
{
    return t.x;
}

__declspec(noinline) int use_get(const test& t)
{
    return t.get();
}

int main()
{
    test t = { 111605 };

    // pick one:
    return use_x(t);
    //return use_get(t);
}
Run Code Online (Sandbox Code Playgroud)

请注意,它不是总是更换简单t.get()t.x,编译器.考虑这样的事情:

t.get() += 5;
Run Code Online (Sandbox Code Playgroud)

这不应该编译,因为函数调用的结果是一个rvalue和+=(对于基元)需要一个左值.编译器会检查这样的事情.