2016-04-16 5 views
0

Ich habe Boost mit mpi erfolgreich gebaut, aber ich habe viele Warnungen mit Boost mpi unter x64-Plattform. Ich benutze Boost 1.59.0 + vs2015. Bitte helfen Sie mir, diese Warnungen loszuwerdenBoost mpi x64 Warnung "size_t to int"

Hier ist mein Testcode.

#include <boost/mpi/environment.hpp> 
#include <boost/mpi/communicator.hpp> 
#include <iostream> 

namespace mpi = boost::mpi; 

int main(int argc, char* argv[]) { 
    mpi::environment env(argc, argv); 
    mpi::communicator world; 

    std::cout << "I am process " << world.rank() << " of " << world.size() 
     << "." << std::endl; 
    return 0; 
} 

Und einige der Warnungen wie folgt aussehen:

1>d:\dependencies\boost_1_59_0\boost\mpi\detail\mpi_datatype_primitive.hpp(61) : warning C4267 : 'argument' : conversion from 'size_t' to 'int', possible loss of data 
1>d:\dependencies\boost_1_59_0\boost\mpi\detail\mpi_datatype_primitive.hpp(80) : warning C4267 : 'argument' : conversion from 'size_t' to 'int', possible loss of data 
1>d:\dependencies\boost_1_59_0\boost\mpi\detail\packed_iprimitive.hpp(62) : warning C4267 : 'argument' : conversion from 'size_t' to 'int', possible loss of data 
1>d:\dependencies\boost_1_59_0\boost\mpi\detail\packed_iprimitive.hpp(106) : warning C4267 : 'argument' : conversion from 'size_t' to 'int', possible loss of data 
1>d:\dependencies\boost_1_59_0\boost\mpi\detail\binary_buffer_iprimitive.hpp(64) : warning C4267 : 'argument' : conversion from 'size_t' to 'int', possible loss of data 
1>d:\dependencies\boost_1_59_0\boost\mpi\detail\packed_oprimitive.hpp(52) : warning C4267 : 'argument' : conversion from 'size_t' to 'int', possible loss of data 
1>d:\dependencies\boost_1_59_0\boost\mpi\detail\packed_oprimitive.hpp(96) : warning C4267 : “初始化” : conversion from 'size_t' to 'int', possible loss of data 
1>d:\dependencies\boost_1_59_0\boost\mpi\detail\packed_oprimitive.hpp(100) : warning C4267 : 'argument' : conversion from 'size_t' to 'int', possible loss of data 
1>d:\dependencies\boost_1_59_0\boost\mpi\detail\binary_buffer_oprimitive.hpp(53) : warning C4267 : 'argument' : conversion from 'size_t' to 'int', possible loss of data 
1>d:\dependencies\boost_1_59_0\boost\mpi\detail\binary_buffer_oprimitive.hpp(87) : warning C4267 : 'argument' : conversion from 'size_t' to 'int', possible loss of data 
1> d:\dependencies\boost_1_59_0\boost\archive\detail\oserializer.hpp(88) : note : see reference to function template instantiation'void boost::mpi::binary_buffer_oprimitive::save<char>(const std::basic_string<char, std::char_traits<char>, std::allocator<char>> &)' 
1> d:\dependencies\boost_1_59_0\boost\archive\detail\oserializer.hpp(232) : note : see reference to function template instantiation 'void boost::archive::save_access::save_primitive<Archive, T>(Archive &, const T &)' 
1>   with 
1>[ 
1>    Archive = boost::mpi::packed_oarchive, 
1>    T = std::string 
1>] 
+1

Eine schlaue Sache zu tun wäre zu überprüfen, ob sizeof (size_t) kleiner oder gleich sizeof (int) in Ihrer Implementierung ist (dies ist OS-spezifisch). Wenn ja, können Sie diese Warnung vernachlässigen. – sjsam

+0

Ich würde das als Bug in Boost betrachten. Stellen Sie vor dem Melden sicher, dass es nicht in der neuesten Version behoben ist (ich habe es gerade überprüft, ist es nicht). – Zulan

+1

@sjsam, 'size_t' ist vorzeichenlos, es wird also selbst für' sizeof (int) == sizeof (size_t) 'zu Datenverlust kommen. – Zulan

Antwort

0

IMHO die MSVC C4267 Warnung zu empfindlich ist. Es erscheint sogar, wenn ein int in ein double konvertiert wird. In diesem Fall kann es jedoch gültig sein, wie @sjsam kommentierte.

Als ich bin zuversichtlich, dass die Umwandlung gültig ist, deaktiviere ich oft die Warnung lokal mit:

#ifdef _MSC_VER 
#pragma warning(push) 
#pragma warning(disable : 4244) // implicit conversion, possible loss of data 
#endif 

vor dem Code, und aktivieren sie mit:

#ifdef _MSC_VER 
#pragma warning(pop) 
#endif 

Wenn Sie sind zuversichtlich, dass der boost::mpi Wert std::numeric_limits<int>::max() nie um steckte sie übertreffen wird dann:

#include <boost/mpi/environment.hpp> 
#include <boost/mpi/communicator.hpp> 

so können Sie die C4267-Warnung nur für boost::mpi deaktivieren.

+0

Bevor dieser Fehler behoben wird, ist dies der beste Weg, um zu umgehen, denke ich. Danke @kenba –

Verwandte Themen