2014-11-16 108 views
3

我有一個圖像功能聲明爲通過常量傳遞對象的信息,並通過與同一個函數

thresholding(const Image &imgSrc, Image &imgDest); 

如果我這樣做,會發生什麼;

Image img; 
tresholding(img, img); 

這是明確的嗎?因爲在這種情況下img已更改。

PS:threshold讀取imgSrc並且如果`IMGSRC [I] < lowerThr - > imgDest [I] = 255別的imgDest [I] = 0

而且更準確地說:

__m128i _mm_src = _mm_load_si128 (any_value); 
__m128i _mm_src = _mm_load_si128 ((__m128i*) &imgSrc[0]); 
__m128i _mm_dest = _mm_load_si128 ((__m128i*) &imgDest[0]); 


_mm_dest = mm_cmpgt_epi16 (a, thr); 
+0

_「這是明確的嗎?」_什麼應該是未定義的呢? –

+0

我想你想在你的第二個代碼塊中調用函數'treshold'而不是'thresholding',並且'Image img()'是一個函數聲明。 – JNevens

+0

@ JN11 absoluetly正確,謝謝。 – user1235183

回答

4

具有可能與一個對象的可能不同類型的多個引用(就像具有指向同一對象的多個指針一樣)沒有問題。函數的行爲可能是太細:像

imgDest[i] = (imgSrc[i] < lowerThr) * 255; 

的表達式爲imgSrcimgDest指相同的對象被明確定義。測序o.s.沒有問題。發生。儘管如此,您應該檢查文檔或threshold的來源 - 它可能以需要imgSrc在整個執行過程中保持不變的方式實現。如果不知道實施情況,你不應該做出假設。

+0

編譯器是否僅通過imgSrc檢查imgSrc對象是否已更改? – user1235183

+0

@ user1235183你是什麼意思?如果函數的行爲是荒謬的或未定義的,編譯器將不會發出診斷。檢查文檔。 – Columbo

4

這是否定義良好取決於功能的規格。該語言允許對同一對象進行多次引用,即使有些是const限定的,而其他的不是,但許多函數不允許。通過imgDest進行的任何修改將立即通過imgSrc可見,並且許多參數類似於您的函數假定在修改爲imgDest後,原始圖像仍在imgSrc中可用。如果你的函數做出了這樣的假設,那麼很容易說這種語言允許這樣的調用,但這就像說語言允許printf(NULL);一樣:在技術上它確實如此,但是如果你也考慮函數的規範,那仍然是未定義的。