Я использую Totalview в качестве отладчика Linux C ++. Функции в нашем коде часто выглядят примерно так
double foo() {
int a = 2;
int b = 3;
return bar(a,b);
}
где некоторая предварительная работа сделана и чем более или менее сложная функция bar
называется оператором возврата.
Это трудно отладить с помощью totalview, поскольку интересное возвращаемое значение не может быть легко обнаружено. Totalview не может оценить выражая bar(a,b)
, Я могу переписать код как
double foo() {
int a = 2;
int b = 3;
const auto retVal = bar(a,b);
return retVal;
}
Теперь я могу поставить точку останова на возвращаемое значение и наблюдать за входом и выходом моей функции bar
,
Как я могу сделать это, не вводя новую (бесполезную) переменную?
Пусть компилятор оптимизирует бесполезную переменную с помощью процесса, называемого оптимизация именованного возвращаемого значения, и оставьте это внутри. (Лично я хотел бы помочь компилятору в максимально возможной степени, используя явно тип возвращаемого значения функции, а не auto
; так что нет потенциального преобразования типа на return
этап.). Для чего это стоит, я делаю это все время, даже с такими тяжелыми предметами, как std::vector
, Вы всегда можете проверить сгенерированный ассемблер, если вы подозреваете, что компилятор делает лишние копии.
Затем вы можете установить точку останова в соответствующем месте, как вы знаете.
В некоторых отладчиках вы можете проверить возвращаемое значение функции напрямую, посмотрев в регистр, но это ни в коем случае не является универсальным.
Ссылка: http://en.cppreference.com/w/cpp/language/copy_elision
Других решений пока нет …