C++ c++;与其他变量的参考变速差

C++ c++;与其他变量的参考变速差,c++,reference,C++,Reference,如果我使用引用变量 int &ret = buffer[balance]; #define INF 123456789 int coins[100]; // 사용가능한 동전들 int n; // 동전 가짓수 int k; // 총 합 int buffer[10001]; // 금액에 맞는 최소값 int check(int balance) { if (balance < 0) return INF; if (balance ==

如果我使用引用变量

int &ret = buffer[balance];
#define INF 123456789

int coins[100]; // 사용가능한 동전들
int n; // 동전 가짓수
int k; // 총 합

int buffer[10001]; // 금액에 맞는 최소값

int check(int balance) {
    if (balance < 0)
        return INF;

    if (balance == 0)
        return 0;

    int &ret = buffer[balance];

    if (ret != -1)
        return ret;

    ret = INF;

    // 가능한 모든 코인에 대해서 반복
    for (int i = 0; i < n; i++) {
        ret = min(check(balance - coins[i]) + 1, ret);
    }

    return ret;
}

int main() {
    // initialization
    memset(buffer, -1, sizeof(buffer));

    cin >> n >> k;

    for (int i = 0; i < n; i++) {
        scanf_s("%d", &coins[i]);
    }

    int ret = check(k);

    if (ret == 0 || ret == INF)
        ret = -1;
    cout << ret << endl;

    return 0;
    }
在解决在线判断问题时,不会出现超时(限制:2s)

当我使用一般变量时

int ret = buffer[balance];
超时发生了,我想知道为什么

这是我使用引用变量的代码

int &ret = buffer[balance];
#define INF 123456789

int coins[100]; // 사용가능한 동전들
int n; // 동전 가짓수
int k; // 총 합

int buffer[10001]; // 금액에 맞는 최소값

int check(int balance) {
    if (balance < 0)
        return INF;

    if (balance == 0)
        return 0;

    int &ret = buffer[balance];

    if (ret != -1)
        return ret;

    ret = INF;

    // 가능한 모든 코인에 대해서 반복
    for (int i = 0; i < n; i++) {
        ret = min(check(balance - coins[i]) + 1, ret);
    }

    return ret;
}

int main() {
    // initialization
    memset(buffer, -1, sizeof(buffer));

    cin >> n >> k;

    for (int i = 0; i < n; i++) {
        scanf_s("%d", &coins[i]);
    }

    int ret = check(k);

    if (ret == 0 || ret == INF)
        ret = -1;
    cout << ret << endl;

    return 0;
    }
#定义INF 123456789
整数硬币[100];//사용가능한 동전들
int n;//동전 가짓수
int k;//총 합
int缓冲区[10001];//금액에 맞는 최소값
整数支票(整数余额){
如果(余额<0)
返回INF;
如果(余额==0)
返回0;
int&ret=缓冲区[余额];
如果(ret!=-1)
返回ret;
ret=INF;
// 가능한 모든 코인에 대해서 반복
对于(int i=0;i>n>>k;
对于(int i=0;i>k;
对于(int i=0;icout当
ret
是一个引用时,您正在通过该引用修改数组,并且您的代码相当于

int check(int balance) {
    if (balance < 0)
        return INF;

    if (balance == 0)
        return 0;

    if (buffer[balance] != -1)
        return buffer[balance];

    buffer[balance] = INF;

    for (int i = 0; i < n; i++) {
        buffer[balance] = min(check(balance - coins[i]) + 1, buffer[balance]);
    }

    return buffer[balance];
}
int检查(int余额){
如果(余额<0)
返回INF;
如果(余额==0)
返回0;
如果(缓冲区[余额]!=-1)
返回缓冲区[余额];
缓冲区[余额]=INF;
对于(int i=0;i

如果
ret
不是引用,则永远不会更新数组,因此
ret!=-1
永远不会为真。

使用引用时,将使用同一堆对象。
我已经为您制作了一个快速的drow,让您了解参考资料的外观:


如果您想了解更多信息,请阅读本文:

,因为当您不使用引用时,代码将完全不做任何事情,并且将一直不做任何事情直到时间结束。因此超时。无需深入研究生成的程序集。它与微级优化无关,但这一事实极大地改变了程序的逻辑。引用与…非引用有着根本的不同。当你使用引用时,你的代码正在做一些完全不同的事情。当你使用引用时,你正在通过引用
ret
修改
缓冲区的内容。另一方面,如果
ret
是一个值,那么该函数不会修改
缓冲区的内容。这可能解释了不同的运行时,尽管我不明白什么是
缓冲区
的好开始with@user463035818哦,对不起,我刚刚编辑了我的question@SamVarshavchik谢谢
int check(int balance) {
    if (balance < 0)
        return INF;

    if (balance == 0)
        return 0;

    if (buffer[balance] != -1)
        return buffer[balance];

    buffer[balance] = INF;

    for (int i = 0; i < n; i++) {
        buffer[balance] = min(check(balance - coins[i]) + 1, buffer[balance]);
    }

    return buffer[balance];
}