3

我正在使用 totalview 作为 linux C++ 调试器。我们代码中的函数通常看起来像这样

double foo() {
    int a = 2;
    int b = 3;
    return bar(a,b);
}

完成了一些初步工作并且或多或少复杂的函数bar称为 return 语句。

这很难用 totalview 进行调试,因为不能轻易观察到有趣的返回值。Totalview 无法评估表达bar(a,b)。我可以将代码重写为

double foo() {
    int a = 2;
    int b = 3;
    const auto retVal = bar(a,b);
    return retVal;
}

现在,我可以在返回值处放置一个断点并观察我的函数的输入和输出bar

如何在不引入新(无用)变量的情况下做到这一点?

4

1 回答 1

0

让编译器通过一个名为 return value optimizationauto的过程来优化“无用”变量,然后将其保留在其中。(虽然我会通过显式使用函数的返回类型而不是; 所以尽可能地帮助编译器在这个阶段没有潜在的类型转换return。)。对于它的价值,我一直这样做,即使是重物,例如std::vector. 如果您怀疑编译器正在制作多余的副本,您可以随时检查生成的汇编器。

然后,您可以在您知道的适当位置设置断点。

在某些调试器中,您可以通过查看寄存器直接检查函数返回值,但这绝不是通用的。

参考:http ://en.cppreference.com/w/cpp/language/copy_elision

于 2017-12-05T08:07:13.997 回答