c++ - 未在函数结果上调用复制构造函数

标签 c++ inline variable-assignment

GCC 会内联一条语句——无论我多么努力地阻止它。我试过了

  • -fno-inline
  • -O0
  • __attribute__ ((noinline))
  • 虚拟汇编("")

没有成功! 这里的代码:

#include<iostream>

using namespace std;

struct A {
  A() {cout << "A::A()" <<endl; }
  A(const A& a) {cout << "A::A(copy)" <<endl; }
  A& operator=(const A& a) {cout << "A::=()" <<endl; return *this;}
};

A __attribute__ ((noinline)) func() 
{
  cout << "func()" << endl;
  A loc;
  asm("");
  return loc;
}

int main() {
  A a = func();
}

这个 (g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2) 的不幸输出是

func()
A::A()

语句 A a = func(); 发生了什么? ??

做这个实验的原因是我想知道当执行到这条语句时会发生什么(因为我需要控制这是如何完成的):

A a = func();

我读到复制构造函数在执行时被调用

A a = b;

(在这种情况下会调用复制构造函数。但在 A a = func(); 的情况下不会) 该函数是内联的。自从我的“struct A”以来,我需要控制这个声明 在现实生活中包含需要处理的动态分配数据。

我是否遗漏了一些明显的东西?!

最佳答案

不,这与被内联的函数无关。内联函数不会改变可观察到的行为。

这是一种称为复制省略的优化,它允许编译器通过直接在目标位置构造返回值来避免复制。您可以使用 g++ 标志 -fno-elide-constructors 禁用它。

无论如何,动态分配的数据应该不是问题。假设一个健全的复制构造函数,您将看到的唯一区别可能是更好的性能。

关于c++ - 未在函数结果上调用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7244363/

相关文章:

c++ - 如何在 C++ 中将所有输入 (cin) 记录到文件中

c++ - 如何修复 OpenGL Superbible 第 6 版书籍提供的 CMake 文件

c++ - 函数参数列表中的函数调用是否加深了堆栈?

c++ - 可以在下面定义一个更简单的函数-(to.string())

css - 内联元素的文本缩进问题

jquery - 动态附加 HTML 后内联 CSS 丢失

python - 赋值语句值

java - java中a + = 10和a = a + 10之间的区别?

variables - 如何设置一个变量等于另一个变量的内容?

c++ - (C++) 为什么 '||' 逻辑运算符返回 1?