我有一个声明为
的图像功能thresholding( const Image &imgSrc, Image &imgDest );
如果我这样做会发生什么;
Image img;
tresholding( img, img );
这个定义明确吗?因为在这种情况下img
已更改。
P.S:threshold
读取imgSrc
,如果`imgSrc [i]< lowerThr - > imgDest [i] = 255 else 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 :(得分:4)
对一个对象具有可能不同类型的多个引用(就像具有指向同一对象的多个指针一样)不成问题。函数的行为也可能很好:像
这样的表达式imgDest[i] = (imgSrc[i] < lowerThr) * 255;
是针对imgSrc
和imgDest
明确定义的,指的是同一个对象。测序没有问题。发生。您应该检查threshold
的文档或来源,但也可以确定 - 它可能以需要imgSrc
在整个执行过程中保持不变的方式实现。你不应该在不知道实施的情况下做出假设。
答案 1 :(得分:4)
这是否定义明确取决于功能的规格。该语言允许多个引用同一个对象,即使有些是const
- 合格而其他不是,但许多函数没有。通过imgDest
进行的任何修改都会立即通过imgSrc
显示,并且许多参数与您的参数相似的函数假设在修改imgDest
后,原始图像为仍然可以在imgSrc
中找到。如果你的函数做了这样的假设,那么很容易说语言允许这样的调用,但这就像说语言允许printf(NULL);
:确定,技术上它确实如此,但如果你也考虑函数的规范,那仍然是未定义的。