Отладка сложного оператора возврата

Я использую 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,

Как я могу сделать это, не вводя новую (бесполезную) переменную?

3

Решение

Пусть компилятор оптимизирует бесполезную переменную с помощью процесса, называемого оптимизация именованного возвращаемого значения, и оставьте это внутри. (Лично я хотел бы помочь компилятору в максимально возможной степени, используя явно тип возвращаемого значения функции, а не auto; так что нет потенциального преобразования типа на return этап.). Для чего это стоит, я делаю это все время, даже с такими тяжелыми предметами, как std::vector, Вы всегда можете проверить сгенерированный ассемблер, если вы подозреваете, что компилятор делает лишние копии.

Затем вы можете установить точку останова в соответствующем месте, как вы знаете.

В некоторых отладчиках вы можете проверить возвращаемое значение функции напрямую, посмотрев в регистр, но это ни в коем случае не является универсальным.

Ссылка: http://en.cppreference.com/w/cpp/language/copy_elision

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]