1
resposta

O que seria mais eficiente ?

Estou com uma dúvida em relação à eficiência do programa. No caso, o professor deu a função:

bool letra_existe (char chute){
    for (int i = 0; i < palavra_secreta.size();i++){
        if (chute == palavra_secreta[i]){
            return true;
        }
    }
    return false;
}

E ndentro da funlão ele usa a variavel global. O que seria mais eficiente de fato, a forma que o professor fez ou criar um outro parâmetro de entrada para a função cujo input seria a "palavra secreta?" Por exemplo:



bool confereLetra(char chute, std::string letra_secreta)
{
    for(char letra : letra_secreta)
    {

        if(chute == letra)
        {
            return true;
        }

    }

    return false;
}

Existe algum ganho computacional entre as duas funções?

1 resposta

Olá.

Num primeiro momento, não haveria ganhos de performance entre as funções, pois não há aumento de uso na memória, nem mais passos para executar o problema.

No entanto, ao colocar um parâmetro da forma como você fez, é feita uma cópia da informação. Ou seja: a string a ser passada para a função é copiada na memória, e a cópia é dada para a sua função usar. Chamamos isso de passar por valor.

O que poderia ser feito é passar por referência constante, dessa forma, não há uma nova alocação da RAM, e você garante que a std::string original não será modificada:

bool conferir_letra(char chute, const std::string& palavra_secreta)
{
    for(char letra : palavra_secreta)
    {
        if(chute == letra)
        {
            return true;
        }
    }
    return false;
}

Isso não criará nova alocação na RAM, e manterá o código menos acoplado, por que essa função poderá ser usada externamente, ou testada, já que não usa de globais.

Porém, lembre-se: otimização logo de início não é algo bom. Faça primeiro o que você entende melhor, depois você busca otimizar o código.

Passar tudo por referência pode, na verdade, deixar seu código mais lento, ou menos compreensível. Assim como qualquer outra coisa, deve-se usar com cuidado.