我正在實現一個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