3

虽然我认为在 VC++ 中这将是一个明智的选择,但仍然值得一问。

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

4

1 回答 1

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);
}

请注意,对于编译器,它并不像总是替换为 , 那样简单t.get()t.x考虑这样的事情:

t.get() += 5;

这不应该编译,因为函数调用的结果是一个右值并且+=(对于原语)需要一个左值。编译器会检查类似的东西。

于 2012-06-29T04:47:27.413 回答