我正在实现一个MPI代码,并且我正在使用MPI_Bcast
函数。其中一个函数的组件是发送的数据的数量,这里的数据的大小是l_nMinplacesPos
。我想分享这个向量的大小。我试过一次sizeof l_nMinplacesPos
返回32,当我用l_nMinplacesPos.size()
我得到2作为矢量的大小!!!。我很困惑哪一个显示矢量的实际大小?他们之间有什么区别?sizeof和.size()之间的区别为一个向量C++
void ParaStochSimulator::broad_casting(long j){
std::cout << "i'm broad_casting" << std::endl;
l_nMinplacesPos = (*m_pcTransitionsInfo)[j]->GetManipulatedPlaces();
double val;
l_anMarking.reserve(l_nMinplacesPos.size());
for (auto lnpos : l_nMinplacesPos)
{
val = m_anCurrentMarking[lnpos];
l_anMarking.push_back(val);
}
for (auto marking : l_anMarking)
{
std::cout << marking << std::endl;
}
MPI_Bcast(&l_anMarking, sizeof l_nMinplacesPos, MPI_DOUBLE, 0, MPI_COMM_WORLD); //->here i used l_nMinplacesPos.size() instead.
}
void ParaStochSimulator::SimulateSingleRun()
{
//prepare a run
PrepareRun();
while ((m_nCurrentTime < m_nOutputEndPoint) && IsSimulationRunning())
{
deterMinTau();
if (mnprocess_id == 0)
{
SimulateSingleStep1();
std::cout << "current time:*****" << m_nCurrentTime << std::endl;
broad_casting(m_nMinTransPos);
std::cout << "size of mani place :" << sizeof l_nMinplacesPos << std::endl;
}
}
PostProcessRun();
MPI_Bcast(&l_anMarking, sizeof l_nMinplacesPos, MPI_DOUBLE, 0, MPI_COMM_WORLD); //->here i used l_nMinplacesPos.size() instead.
std::cout << "size of mani place :" << sizeof l_nMinplacesPos << std::endl;
}
你想知道向量中有多少条目?然后你使用'vector :: size()'。 sizeof()'没有办法可以帮助你,因为它是一个*编译时*常量。它不知道你在运行时将多少个项目放入向量中。 – PaulMcKenzie
也'sizeof'返回一个类型'T'占用的字节数。这就是为什么它只知道编译时信息。你可以做一个小测试,发现'sizeof(your_vector)'不管你有没有物品,或者你的矢量中有10,000个物品,sizeof(your_vector)都是一样的。 – PaulMcKenzie
MPI只是像memcpy一样复制内存。由于vector不是一成不变的,所以无论大小如何,这都是未定义的行为。 – Dani