Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как проредить исходники от неиспользуемого кода? или хоть от неиспользуемых файлов. 
:(
    Опции темы
amdei
Дата 27.10.2007, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.10.2007

Репутация: нет
Всего: нет



Вообразим следующую ситуацию: есть проект, при разработке которого используется кучи библиотек (как сторонних, так и унаследованных) в виде исходников. (Как пример - boost, STLPort, CommonCPP, Loki, впишите что хотите.)

И, скажем, надо эти исходники кому-то передать, да чтобы было их поменьше.
Скажем, для аудита. И чтобы бедным аудиторам задачу облегчить (а себе заодно кучу денег сэкономить), есть желание объем исходников подсократить, за счет удаления неиспользуемого кода и файлов.
Автоматически.
Ну вот не нужен мне в бусте никто кроме shared_ptr, а контейнеров кроме vector из STLport я не использую - так поудаляю всё кроме них.

С помощью каких инструментов это сделать можно? Автоматически.
Ибо ручками - умрёшь.

Гугл ответа с наскоку не дал. :( Т.е. средства для VB, скажем, подобные вроде есть, а вот для C++ - не обнаружил пока.

Если решать задачу на уровне отсекания не включаемых файлов - то её можно в принципе решить и самостоятельно (хотя хочется, естественно, готового). Но это не будет в должной степени эффективно. Ибо включаться-то какой-то заголовок допустим может, но из него может не использоваться ничего. А еще кучи библиотек включают имею заголовок biblioteka.h, в который включают все хедеры библиотеки. Даром что половина не используется. :(
А если поставить задачу вырезать невызываемые функции и пр. - козлёночком станешь, пока решишь.

У кого какие идеи по решению такой задачи есть?
PM MAIL   Вверх
Mayk
Дата 27.10.2007, 04:38 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134





Цитата(amdei @  27.10.2007,  05:53 Найти цитируемый пост)

У кого какие идеи по решению такой задачи есть? 
  •  можно смотреть в сторону программ типа cflow [google it]. Они показывают кто что вызывает.

    Код

    void a(){}
    void b(){}
    int main( int argc, char** argv ){
        while( argc-- % 3 )
            a();
    }

    Цитата

    08:30:dvl:~/src/pol$ cflow a.c
    main() <int main (int argc,char **argv) at a.c:8>:
        a() <void a () at a.c:2>

    правда, не знаю есть ли подобное для с++.
  •  для boost'а есть bcp

    Цитата

     The bcp utility is a tool for extracting subsets of Boost, it's useful
     for Boost authors who want to distribute their library separately from
     Boost, and for Boost users who want to distribute a subset of Boost
     with their application.

  •  профайлеры показывают  кто вызывался.
    Цитата

    08:37:dvl:~/src/pol$ cat a.cpp
    #include <boost/bind.hpp>
    #include <vector>
    #include <algorithm>

    struct foo{
    };

    struct F{
    void x( foo g ){ }
    };


    int main(){
        std::vector<foo> v;
        F someinstance;
        std::for_each( v.begin(), v.end(), boost::bind( &F::x, someinstance, _1 ) );

    }


    08:37:dvl:~/src/pol$ g++ -p -pg a.cpp
    08:38:dvl:~/src/pol$ ./a.out 
    08:38:dvl:~/src/pol$ gprof >a.prof
    08:38:dvl:~/src/pol$ cat a.prof
    ---8<--
      0.00      0.00     0.00        3     0.00     0.00  __gnu_cxx::new_allocator<foo>::~new_allocator()
      0.00      0.00     0.00        2     0.00     0.00  __gnu_cxx::new_allocator<foo>::new_allocator(__gnu_cxx::new_allocator<foo> const&)
      0.00      0.00     0.00        2     0.00     0.00  __gnu_cxx::__normal_iterator<foo*, std::vector<foo, std::allocator<foo> > >::__normal_iterator(foo* c
      0.00      0.00     0.00        2     0.00     0.00  __gnu_cxx::__normal_iterator<foo*, std::vector<foo, std::allocator<foo> > >::base() const
      0.00      0.00     0.00        2     0.00     0.00  std::allocator<foo>::~allocator()
      0.00      0.00     0.00        1     0.00     0.00  boost::_bi::list2<boost::_bi::value<F>, boost::arg<1> >::list2(boost::_bi::value<F>, boost::arg<1>)
      0.00      0.00     0.00        1     0.00     0.00  boost::_bi::value<F>::value(F const&)
      0.00      0.00     0.00        1     0.00     0.00  boost::_bi::bind_t<void, boost::_mfi::mf1<void, F, foo>, boost::_bi::list2<boost::_bi::value<F>, boos
      0.00      0.00     0.00        1     0.00     0.00  boost::_mfi::mf1<void, F, foo>::mf1(void (F::*)(foo))
      0.00      0.00     0.00        1     0.00     0.00  boost::_bi::bind_t<void, boost::_mfi::mf1<void, F, foo>, boost::_bi::list_av_2<F, boost::arg<1> >::ty
      0.00      0.00     0.00        1     0.00     0.00  __gnu_cxx::new_allocator<foo>::new_allocator()
      0.00      0.00     0.00        1     0.00     0.00  bool __gnu_cxx::operator!=<foo*, std::vector<foo, std::allocator<foo> > >(__gnu_cxx::__normal_iterato
      0.00      0.00     0.00        1     0.00     0.00  std::allocator<foo>::allocator(std::allocator<foo> const&)
      0.00      0.00     0.00        1     0.00     0.00  std::allocator<foo>::allocator()
      0.00      0.00     0.00        1     0.00     0.00  std::allocator<foo>::allocator(std::allocator<foo> const&)
      0.00      0.00     0.00        1     0.00     0.00  std::allocator<foo>::~allocator()
      0.00      0.00     0.00        1     0.00     0.00  std::_Vector_base<foo, std::allocator<foo> >::_Vector_impl::_Vector_impl(std::allocator<foo> const&)
      0.00      0.00     0.00        1     0.00     0.00  std::_Vector_base<foo, std::allocator<foo> >::_Vector_impl::~_Vector_impl()
      0.00      0.00     0.00        1     0.00     0.00  std::_Vector_base<foo, std::allocator<foo> >::_M_deallocate(foo*, unsigned long)
      0.00      0.00     0.00        1     0.00     0.00  std::_Vector_base<foo, std::allocator<foo> >::_M_get_Tp_allocator()
    и т.д.
    ---8<--



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
amdei
Дата 27.10.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.10.2007

Репутация: нет
Всего: нет



Мда, осталось только как-нибуть использовать то, что выдают cflow и профайлеры. smile
За bcp - спасибо!
Аналоги cflow для C++... В VS есть Caller Graph - показывает кто кого вызывает, и кто вызывает его.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0428 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.