Skip to content

Const Correctness em HPC

Const Correctness (uso de constantes) é um conceito em C++ que garante que os dados não sejam modificados quando não deveriam ser. Usar const corretamente pode melhorar a legibilidade do código, evitar erros e permitir otimizações pelo compilador.

Usos Comuns de const

1. Variáveis Locais

Declarar variáveis locais como const se você não pretende modificar o valor delas.

const int valor = 10;

2. Parâmetros de Função

Usar const em parâmetros de função para garantir que os argumentos não sejam modificados.

void imprimeValor(const int valor) {
    std::cout << "Valor: " << valor << std::endl;
}

3. Ponteiros e Referências

Declarar ponteiros e referências como const para garantir que os dados apontados ou referenciados não sejam alterados.

void imprimeValor(const int* ptr) {
    std::cout << "Valor: " << *ptr << std::endl;
}

void imprimeValor(const int& ref) {
    std::cout << "Valor: " << ref << std::endl;
}

4. Métodos de Classe

Declarar métodos como const para garantir que eles não modifiquem o estado do objeto.

class Ponto {
public:
    Ponto(int x, int y) : x(x), y(y) {}

    int getX() const { return x; }
    int getY() const { return y; }

private:
    int x, y;
};

Exemplo: Multiplicação de Matrizes com Const Correctness

Vamos considerar um exemplo de multiplicação de matrizes onde aplicamos const correctness para garantir que os dados de entrada não sejam modificados.

#include <iostream>
#include <vector>
#include <chrono>

using namespace std;
using namespace std::chrono;

// Função para multiplicar duas matrizes com const correctness
void multiplicaMatriz(const vector<vector<int>>& A, const vector<vector<int>>& B, vector<vector<int>>& C) {
    int N = A.size();
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            C[i][j] = 0;
            for (int k = 0; k < N; ++k) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }
}

int main() {
    int N = 100; // Tamanho da matriz
    vector<vector<int>> A(N, vector<int>(N, 1));
    vector<vector<int>> B(N, vector<int>(N, 1));
    vector<vector<int>> C(N, vector<int>(N, 0));

    auto inicio = high_resolution_clock::now();

    // Chama a função de multiplicação de matrizes
    multiplicaMatriz(A, B, C);

    auto fim = high_resolution_clock::now();
    auto duracao = duration_cast<milliseconds>(fim - inicio).count();

    cout << "Tempo de multiplicação de matrizes: " << duracao << "ms" << endl;

    return 0;
}

Const Correctness em Classes

No contexto de HPC, classes frequentemente encapsulam dados e operações. Garantir const correctness em métodos de classe é essencial.

Exemplo: Classe de Matriz com Métodos Const

class Matriz {
public:
    Matriz(int N) : data(N, vector<int>(N, 0)) {}

    const vector<int>& operator[](int index) const {
        return data[index];
    }

    vector<int>& operator[](int index) {
        return data[index];
    }

    void imprime() const {
        for (const auto& linha : data) {
            for (int valor : linha) {
                cout << valor << " ";
            }
            cout << endl;
        }
    }

private:
    vector<vector<int>> data;
};

int main() {
    Matriz matriz(3);

    matriz[0][0] = 1;
    matriz[1][1] = 2;
    matriz[2][2] = 3;

    cout << "Matriz:" << endl;
    matriz.imprime();

    return 0;
}

Aplicar const correctness pode prevenir erros e permitir otimizações adicionais pelo compilador. Usar const de maneira apropriada em variáveis, parâmetros de função, ponteiros, referências e métodos de classe é uma prática recomendada para escrever código robusto e eficiente.