以下内联函数是否保证具有相同的实现?

时间:2015-02-19 11:04:31

标签: c++ inline-functions

  • 以下功能是否保证具有相同的实现(即目标代码)?
  • 如果下面的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);

2 个答案:

答案 0 :(得分:1)

  

以下功能是否保证具有相同的实现(即目标代码)?

不,语言只指定行为,而不是代码生成,因此编译器是否有两个具有等效行为的代码产生相同的目标代码。

  

如果下面的Foo是原始类型(例如int),这会改变吗?

如果是(或者,更一般地说,如果它可以轻易复制),则所有三个都具有相同的行为,因此可以预期产生类似的代码。

如果它是一个非平凡的类类型,那么它取决于类的特殊功能的作用。每个函数都以稍微不同的方式调用这些函数:

  • 第一个可以复制初始化一个临时对象(调用复制构造函数),复制初始化foo,然后销毁临时对象(调用析构函数);但是更有可能它会暂时消失,变得等同于第二个。
  • 第二个将复制初始化foo(调用复制构造函数)
  • 第三个将默认初始化foo(调用默认构造函数),然后复制赋值给它(调用赋值运算符)。

因此,它们是否等效取决于默认初始化和复制赋值是否具有与复制初始化相同的行为,以及(可能)创建和销毁临时是否具有副作用。如果它们是等价的,那么您可能会得到类似的代码。

  

这会改变Foo的大小吗?

大小无关紧要。重要的是它是否是微不足道的(因此复制初始化和复制分配都只是复制字节)或非平凡(因此它们调用用户定义的函数,这些函数可能相互之间也可能不相同)。 / p>

答案 1 :(得分:0)

标准草案N3337在1.9.5中包含以下规则:"符合要求的[C ++]实现[...]应产生与相应抽象实例的可能执行之一相同的可观察行为机器具有相同的程序和相同的输入。"在1.9.9中,它将可观察行为定义为I / O和易失性值。这意味着只要程序的I / O和易失性保持不变,实现就可以做到它想要的。如果您没有I / O或易失性程序,则程序不需要执行任何操作(这使得基准测试很难通过高优化来实现)。

请注意,标准特别完全没有说明编译器应该发出什么代码。地狱,它可能解释来源。

这回答了你的问题:没有。