2017-02-16 25 views
0

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


} 
+1

你想知道向量中有多少條目?然後你使用'vector :: size()'。 sizeof()'沒有辦法可以幫助你,因爲它是一個*編譯時*常量。它不知道你在運行時將多少個項目放入向量中。 – PaulMcKenzie

+1

也'sizeof'返回一個類型'T'佔用的字節數。這就是爲什麼它只知道編譯時信息。你可以做一個小測試,發現'sizeof(your_vector)'不管你有沒有物品,或者你的矢量中有10,000個物品,sizeof(your_vector)都是一樣的。 – PaulMcKenzie

+1

MPI只是像memcpy一樣複製內存。由於vector不是一成不變的,所以無論大小如何,這都是未定義的行爲。 – Dani

回答

4

.size()返回在矢量元素的數量。這就是你應該使用的。

sizeof給出了對象定義使用的字節的數,不包括通過使用指針分配的任何附加存儲。它是編譯器在編譯時根據vector類的聲明生成的靜態常量。

0

值得一提的sizeof()也是這樣的一個事實,即當您直接處理數組的單元格內容(特別是字符串)時,它可能會將該特定單元格的長度限制爲8個字節。在我的實踐考試中,我有一項任務是創建一個C/C++程序,它定位插入到數組中的每個單詞的第一個字母。在使用sizeof()後,它只返回該數組的前8個字符,其餘部分已經被丟失,所以要小心。

+0

謝謝大家現在我明白了 –

+0

不客氣。 – TheInvisibleMan

相關問題