【发布时间】:2015-02-19 11:04:30
【问题描述】:
- 是否保证以下函数具有相同的实现(即目标代码)?
- 如果下面的
Foo是原始类型(例如int),这种情况会改变吗? - 这会随着
Foo的大小而改变吗?
按值返回:
inline Foo getMyFooValue() { return myFoo; }
Foo foo = getMyFooValue();
引用返回:
inline const Foo &getMyFooReference() { return myFoo; }
Foo foo = getMyFooReference();
就地修改:
inline void getMyFooInPlace(Foo &theirFoo) { theirFoo = myFoo; }
Foo foo;
getMyFooInPlace(foo);
【问题讨论】:
-
函数本身发出的代码(例如,如果它们的地址被占用)显然是不同的。你的意思是如果调用站点的代码在内联后会改变吗?此外,其中之一与其他不同。
-
如果您询问保证,无论如何都没有。只要可观察到的行为相同,编译器就可以做它想做的事情(例如,是否执行内联!)。例如,如果可以证明 myFoo 不会改变,它可以简单地发出使用直接值而不是引用真实内存的汇编程序。
-
除了我在下面的正式回复之外,我了解您假设返回对原始类型的 const 引用可能会被实现为返回值的副本。虽然编译器可能会在只需要值的情况下通过高度优化和内联来做到这一点,但我认为如果有人获取
getMyFooReference()返回的地址(其他地方!),编译器可能总是发出真正的“引用”,即使当要求该值(即需要取消引用的地址),至少在低优化的情况下。 -
我没有考虑获取参考的地址!很好的收获。
标签: c++ inline-functions