gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:25:30 26 4
gpt4 key购买 nike

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

最佳答案

Are the following functions guaranteed to have the same implementation (i.e. object code)?

不,该语言只指定行为,不指定代码生成,因此由编译器决定具有相同行为的两段代码是否产生相同的目标代码。

Does this change if Foo below is a primitive type instead (e.g. int)?

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

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

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

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

Does this change with the size of Foo?

不,尺寸无关紧要。重要的是它是微不足道的(因此复制初始化和复制赋值都只是复制字节)还是非微不足道的(以便它们调用用户定义的函数,它们可能彼此等效,也可能不等效)。

关于c++ - 以下内联函数是否保证具有相同的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28604692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com