Мы проводим исследования библиотек LLVM, и мы обнаружили, что ИК-библиотека иногда достигает стеков вызовов до 29 вызовов методов.Является ли код, который производит глубокие стеки вызовов, считается анти-шаблоном?
Иногда, когда я вижу некоторые сбои в инфраструктурах iOS, я также наблюдаю довольно глубокие стеки вызовов.
Мой вопрос заключается в том, можем ли мы рассуждать о том, может быть что-то не так с дизайном кода, который называет себя на таком большом уровне глубины.
Вот пример:
/usr/local/LLVM/llvm/unittests/IR/AttributesTest.cpp:54
/usr/local/LLVM/llvm/lib/IR/LLVMContext.cpp:162
/usr/local/LLVM/llvm/lib/IR/LLVMContext.cpp:162
/usr/local/LLVM/llvm/lib/IR/LLVMContextImpl.cpp:54
/usr/local/LLVM/llvm/lib/IR/LLVMContextImpl.cpp:59
/usr/local/LLVM/llvm/lib/IR/Module.cpp:60
/usr/local/LLVM/llvm/lib/IR/Module.cpp:62
/usr/local/LLVM/llvm/lib/IR/Module.cpp:456
/usr/local/LLVM/llvm/lib/IR/Function.cpp:350
/usr/local/LLVM/llvm/lib/IR/BasicBlock.cpp:98
/usr/local/LLVM/llvm/include/llvm/ADT/ilist.h:282
/usr/local/LLVM/llvm/include/llvm/ADT/ilist.h:267
/usr/local/LLVM/llvm/lib/IR/SymbolTableListTraitsImpl.h:76
/usr/local/LLVM/llvm/lib/IR/BasicBlock.cpp:90
/usr/local/LLVM/llvm/lib/IR/SymbolTableListTraitsImpl.h:58
/usr/local/LLVM/llvm/lib/IR/ValueSymbolTable.cpp:75
/usr/local/LLVM/llvm/lib/IR/ValueSymbolTable.cpp:47
/usr/local/LLVM/llvm/include/llvm/Support/Casting.h:132
/usr/local/LLVM/llvm/include/llvm/Support/Casting.h:112
/usr/local/LLVM/llvm/include/llvm/Support/Casting.h:122
/usr/local/LLVM/llvm/include/llvm/Support/Casting.h:96
/usr/local/LLVM/llvm/include/llvm/IR/Value.h:777
/usr/local/LLVM/llvm/include/llvm/Support/Casting.h:132
/usr/local/LLVM/llvm/include/llvm/Support/Casting.h:122
/usr/local/LLVM/llvm/include/llvm/Support/Casting.h:75
/usr/local/LLVM/llvm/include/llvm/IR/Value.h:771
/usr/local/LLVM/llvm/include/llvm/Support/Casting.h:132
/usr/local/LLVM/llvm/include/llvm/Support/Casting.h:122
/usr/local/LLVM/llvm/include/llvm/Support/Casting.h:75
/usr/local/LLVM/llvm/include/llvm/IR/Value.h:759
P.S. Примерный стек вызовов фактически создается деструктором класса LLVMContext: LLVMContext::~LLVMContext()
. Это еще один пример из очень старого сообщения из Java-мира: Java call stack – from HTTP upto JDBC as a picture.
Зависит от того, как «глубокие» масштабы. Например, для обхода дерева достаточно стандартно производить масштабирование таблиц вызовов с глубиной дерева. – user2357112
Его в глаза смотрящего. Возможно, виртуальные методы - это анти-шаблон. Возможно, даже C++ или объектная ориентация - это анти-шаблон. – wildplasser
Обход дерева и другой рекурсивный шаблон не должны использовать стек вызовов для рекурсии, но итеративную реализацию, если у нас нет гарантии на глубину рекурсии, чтобы избежать взрыва ограничения размера стека. Это справедливо в Clang/LLVM. – Joky