Код: Выделить всё
#include
#include
#include
#ifdef NO_TEMPLATE
using T = int;
#else
template
#endif
__attribute__((noinline))
int func(T n) {
int count = 0;
while(n != 1) {
if (n % 2 == 0)
n = n / 2;
else
n = 3*n + 1;
count++;
}
return count;
}
int main() {
srand(time(0));
int x = rand() % 10000;
int iters = func(x);
printf("func(%d) => %d iters\n", x, iters);
}
Наиболее запутанная вещь для меня это, что, с помощью Noinline attruition, идентичная объекта, идентичная объекта, идентичная объекта, идентичная объекта. Функция, которая предполагает, что код не оптимизирован по-разному между двумя случаями: https://godbolt.org/z/jyc67vef7br/> Вы можете видеть, что версия без Template позволяет мне шаг по одной строке через цикл:
Код: Выделить всё
$ g++ -g3 -O1 mre.cc -DNO_TEMPLATE && gdb a.out -n -batch -ex 'tb func' -ex r -ex n -ex n -ex n
Temporary breakpoint 1, func (n=n@entry=4522) at mre.cc:13
13 while(n != 1) {
14 if (n % 2 == 0)
15 n = n / 2;
18 count++;
< /code>
Но шаблонная версия выходит сразу после разрыва функции: < /p>
$ g++ -g3 -O1 mre.cc && gdb a.out -n -batch -ex 'tb func' -ex r -ex n -ex n -ex n
Temporary breakpoint 1, func (n=n@entry=7368) at mre.cc:13
13 while(n != 1) {
main () at mre.cc:27
27 printf("func(%d) => %d iters\n", x, iters);
func(7368) => 132 iters
[Inferior 1 (process 2183425) exited normally]
< /code>
Почему шаблонная версия, кажется, дает практически нет информации о линии по линии? Есть ли доступны какие -либо варианты, кроме компиляции с -O0 Подробнее здесь: https://stackoverflow.com/questions/797 ... ebug-lines
Мобильная версия