我一直在用kotlin编写一些opencv应用程序,根据下面的代码偶然发现了一件我很好奇的问题:
CREATE VIEW INFORMATION_SCHEMA.TABLE_CONSTRAINTS
AS
SELECT DB_NAME() AS CONSTRAINT_CATALOG,
SCHEMA_NAME(c.schema_id) AS CONSTRAINT_SCHEMA,
c.NAME AS CONSTRAINT_NAME,
DB_NAME() AS TABLE_CATALOG,
SCHEMA_NAME(t.schema_id) AS TABLE_SCHEMA,
t.NAME AS TABLE_NAME,
CASE c.type
WHEN 'C ' THEN 'CHECK'
WHEN 'UQ' THEN 'UNIQUE'
WHEN 'PK' THEN 'PRIMARY KEY'
WHEN 'F ' THEN 'FOREIGN KEY'
END AS CONSTRAINT_TYPE,
'NO' AS IS_DEFERRABLE,
'NO' AS INITIALLY_DEFERRED
FROM sys.objects c
LEFT JOIN sys.tables t ON t.object_id = c.parent_object_id
WHERE c.type IN ('C', 'UQ', 'PK', 'F')
编译器(通常)是否像这些连续调用(imreads)一样优化这样的IO操作?
有哪些经过验证和/或优雅的方法来解决这个问题?
答案 0 :(得分:3)
我不认为编译器有任何方法可以知道任意方法是无副作用的。事实上,这个(我假设)不存在 - 这里有竞争条件的可能性。
避免这种情况的一种方法是使用以下方法:
val image = with(Imgcodecs.imread(filename)) {
if (!empty()) {
this
} else {
Mat.eye(...)
}
}
或更明确的东西,从而避免了with
idiom的魔力:
val image = {
val mtx = Imgcodecs.imread(filename)
if (!mtx.empty()) {
mtx
} else {
Mat.eye(...)
}
}