基于具有条件的IO操作的常量变量初始化

时间:2018-04-03 20:25:00

标签: opencv io kotlin conditional const

我一直在用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操作?

有哪些经过验证和/或优雅的方法来解决这个问题?

1 个答案:

答案 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(...)
    }
}