【问题标题】:Does the compiler optimize trivial getter methods into simple field accesses?编译器是否将琐碎的 getter 方法优化为简单的字段访问?
【发布时间】:2012-06-30 15:24:30
【问题描述】:

虽然我认为在 VC++ 中这很简单,但仍然值得一问。

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

【问题讨论】:

  • 可能。只需在 VC++ 中编译一个完全优化的示例,但要调试符号,并在函数处设置断点,然后查看程序集。
  • 多年来一直如此。事实上,你不需要为类内部定义的简单方法指定inline。这是有意的,以保持简单的 getter 简单。

标签: c++ visual-c++ methods compiler-optimization getter


【解决方案1】:

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

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;

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

【讨论】:

  • 完美,这就是我需要知道的。
  • int& x(void) { return x; } foo.x() = 5;也编译为 foo.x = 5;
猜你喜欢
  • 2019-07-02
  • 2010-11-16
  • 2014-11-16
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
相关资源
最近更新 更多