2010-08-14 30 views
3

Je voulais donc séparer uniquement les pointeurs intelligents de boost à utiliser dans mon projet et j'ai été guidé pour utiliser l'utilitaire bcp.Pourquoi `bcp smart_ptr dir /` de Boost a-t-il copié 6 Mo de code source?

Aujourd'hui je l'ai compilé et l'ai fait bcp smart_ptr to_copy_to_my_project/.

Le résultat: 6 Mo de code dans le répertoire to_copy_to_my_project/.

Vous plaisantez? Je ne veux pas ajouter 6 Mo de fichiers d'en-tête à mon projet 100 Ko juste pour utiliser des pointeurs intelligents.

Par exemple, il copie le stuff win32 suivant (je suis sous Linux):

Copying file: boost/thread/win32/basic_timed_mutex.hpp 
Copying file: boost/thread/win32/condition_variable.hpp 
Copying file: boost/thread/win32/interlocked_read.hpp 

Pourquoi serait-il copier des trucs win32 avec smart_ptr quand je suis sur Linux?

aussi:

Copying file: boost/mpl/aux_/preprocessed/msvc60/advance_backward.hpp 
... 
Copying file: boost/mpl/aux_/preprocessed/msvc70/advance_backward.hpp 
... 
Copying file: boost/mpl/aux_/preprocessed/mwcw/advance_backward.hpp 

Et:

Copying file: boost/date_time/adjust_functors.hpp 

Pourquoi smart_ptr dépendent date_time?

aussi ce que sur tous ces tests qu'il recopié:

Copying file: libs/smart_ptr/test/allocate_shared_esft_test.cpp 
... 

Je ne ai pas besoin de tout ça! J'ai juste besoin de smart_ptr!

Ai-je commis une erreur? Pourquoi a-t-il copié 6 Mo de code juste pour les pointeurs intelligents, que je m'attendrais à être 10 Ko ou 20 Ko ...

Merci, Boda Cydo.

+0

Pour ceux qui ne connaissent pas ce qu'est bcp: http://www.digipedia.pl/man/doc/view/bcp.1/ – robert

+0

Quel compilateur utilisez-vous? – robert

+0

J'utilise gcc. Avez-vous des conseils pour l'agrandir? Je l'ai maintenant à 3 Mo après la suppression de nombreux trucs et tests liés au compilateur. – bodacydo

Répondre

0

Vous pouvez simplement utiliser le pointeur partagé de la STL: std::tr1::shared_ptr, qui pour toutes fins "est" boost::shared_ptr.

+0

Mais alors il faut que je compile mon code avec -std = C++ 0x, non? – bodacydo

0

Je suppose que vous pouvez supprimer les dossiers test et win32 - ils ne sont probablement inclus que lors des tests ou sur cette plate-forme. Je ne peux pas parler à la plupart des fichiers d'en-tête, mais je sais que smart_ptr fait beaucoup de choses folles afin que vous puissiez convertir boost :: shared_ptr <Foo> en boost :: shared_ptr < const Foo >, que la plupart des modèles ne peuvent pas faire . Si vous souhaitez un pointeur de comptage qui ne rentre que dans quelques fichiers, il n'est pas difficile d'en écrire un, mais il ne sera pas aussi agréable que boost.

Puisque vous dites que vous êtes sous Linux, pourquoi ne pas simplement lister le boost en tant que dépendance?

+0

L'augmentation de la liste en tant que dépendance est plutôt effrayante: elle est compressée à 37 Mo et décompressée à plus de 100 Mo. Pour mon application de 100 Ko, c'est 1000 fois plus ... – bodacydo

+1

La plupart des systèmes Linux ont déjà un boost. Votre petite application ne sera pas la seule chose à l'utiliser. Redistribuer boost dans votre application est un gaspillage. – robert

+1

Le comportement et les facilités varient selon les versions. Il n'est pas aussi simple que "liste boost comme une dépendance" –

0

La raison étant que boost prend en charge une myriade de plates-formes et de compilateurs et de modules de boost utilise libéralement d'autres modules de boost. Même si #ifdef: ed loin de la plupart, bcp n'est pas assez intelligent pour le faire.

J'ai eu un problème similaire, donc je comprends votre préoccupation. J'ai essayé d'exécuter le préprocesseur avec les paramètres de la plate-forme, puis le code est devenu beaucoup plus petit. Finalement, nous avons mis à jour le compilateur vers la version qui supporte C++ tr1 et utilisons std :: tr1 :: shared_ptr.On pourrait argumenter que 6Megs sont un petit prix à payer pour les pointeurs intelligents standard de l'industrie, mais pas tous les développeurs/architectes pensent de la même façon et puisque je ne suis pas despote, je devais aller avec ce que l'équipe décide.

0

bcp copiera beaucoup moins si vous

bcp shared_ptr.hpp to_copy_to_my_project/. 

Il semble encore beaucoup trop, je suis d'accord.

1

Si vous voulez simplement smart_ptr et vous n'êtes pas intéressé par #define « ing BOOST_SP_USE_QUICK_ALLOCATOR (non défini par défaut), il vous suffit:

boost/assert.hpp 
boost/checked_delete.hpp 
boost/config.hpp 
boost/config/compiler/* 
boost/config/no_tr1/functional.hpp 
boost/config/no_tr1/memory.hpp 
boost/config/no_tr1/utility.hpp 
boost/config/platform/* 
boost/config/posix_features.hpp 
boost/config/select_compiler_config.hpp 
boost/config/select_platform_config.hpp 
boost/config/select_stdlib_config.hpp 
boost/config/stdlib/* 
boost/config/suffix.hpp 
boost/config/user.hpp 
boost/current_function.hpp 
boost/detail/interlocked.hpp 
boost/detail/sp_typeinfo.hpp 
boost/detail/workaround.hpp 
boost/enable_shared_from_this.hpp 
boost/exception/detail/attribute_noreturn.hpp 
boost/exception/exception.hpp 
boost/memory_order.hpp 
boost/non_type.hpp 
boost/shared_ptr.hpp 
boost/smart_ptr/* 
boost/throw_exception.hpp 
boost/type.hpp 

Cela vient à 365K, avec la majeure partie des le code est actuellement en boost/smart_ptr. Il y a encore beaucoup de code dans boost/config. Si vous connaissez les plates-formes que vous ciblez, vous pouvez réduire boost/config/compiler, boost/config/platform et boost/config/stdlib. Ensuite, la grande majorité du code serait en boost/smart_ptr.