2014-11-16 20 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);一样:在技术上它确实如此,但是如果你也考虑函数的规范,那仍然是未定义的。