在C中干燥缓存

Cha*_*les 3 c dry memoization

我想要干掉以下C代码:

if (i < SIZE_OF_V) {
    if (V[i])
        K = V[d];
    else
        K = V[d] = (expensive complicated call);
} else {
    K = (expensive complicated call);
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?一个本地宏可以工作,但我更喜欢一个更现代的替代品.

ale*_*nis 5

你可以干脆做

if (i < SIZE_OF_V && V[i]) {
    K = V[d];
} else {
    K = (expensive complicated call);

    if (i < SIZE_OF_V)
        V[d] = K;
}
Run Code Online (Sandbox Code Playgroud)

你也可以expensive complicated call在你的if条件中从两个地方放入一个外部函数和callit :

int myExpensiveAndComplicatedCall() {
    // Do things
}

if (i < SIZE_OF_V) {
    if (V[i])
        K = V[d];
    else
        K = V[d] = myExpensiveAndComplicatedCall();
} else {
    K = myExpensiveAndComplicatedCall();
}
Run Code Online (Sandbox Code Playgroud)