Home

ITA - Appunti Cpp 014 - Struct VS Class

linux cpp

Le struct e le classi class rappresentano due concetti fondamentali per la gestione e l’organizzazione dei dati.

Definizione e Differenze Fondamentali

Struct

Le struct sono tipicamente utilizzate per raggruppare variabili correlate sotto un unico nome. Ogni elemento all’interno di una struct è chiamato “membro”.

Classi

Le classi sono il fondamento della programmazione orientata agli oggetti (OOP). Esse permettono di creare oggetti che combinano dati (membri dei dati) e funzioni (metodi) che operano su quei dati.

Confronto di Utilizzo

Performance

In termini di performance, le struct sono spesso preferite quando si ha a che fare con piccole quantità di dati che non richiedono un comportamento complesso. Le classi, invece, essendo più estese, possono introdurre un overhead maggiore; tuttavia, la loro capacità di gestire comportamenti complessi e la flessibilità nella progettazione software le rendono la scelta preferita per sistemi più grandi e complessi.

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

struct Test_Struct {
  int i;
  double d;
  char c;
};

class Test_Class {
public:
  int i;
  double d;
  char c;
};

long int sizes_vect[] = {100000, 1000000, 10000000, 100000000};

int main() {
  // Creazione di vettori di struct e class
  for (int s : sizes_vect)
  {
    std::cout << "Size " << s << std::endl;
    std::vector<Test_Struct> struct_vector(s);
    std::vector<Test_Class> class_vector(s);

    // Misurazione del tempo per copiare le struct
    auto start_struct_copy = std::chrono::high_resolution_clock::now();
    std::vector<Test_Struct> struct_copy = struct_vector;
    auto end_struct_copy = std::chrono::high_resolution_clock::now();

    auto duration_struct_copy = std::chrono::duration_cast<std::chrono::milliseconds>(end_struct_copy - start_struct_copy).count();
    std::cout << "Tempo per copiare le struct: " << duration_struct_copy << " ms" << std::endl;

    // Misurazione del tempo per copiare le classi
    auto start_class_copy = std::chrono::high_resolution_clock::now();
    std::vector<Test_Class> class_copy = class_vector;
    auto end_class_copy = std::chrono::high_resolution_clock::now();

    auto duration_class_copy = std::chrono::duration_cast<std::chrono::milliseconds>(end_class_copy - start_class_copy).count();
    std::cout << "Tempo per copiare le classi: " << duration_class_copy << " ms" << std::endl;
  }
    
    return 0;
}

link al sorgente

Complessità e Manutenibilità

Quando si tratta di gestire la complessità e la manutenibilità del codice, le classi sono di solito superiori. La capacità di utilizzare l’ereditarietà per estendere le funzionalità e il polimorfismo per gestire oggetti diversi tramite un’interfaccia comune permette una migliore organizzazione del codice.

Le struct, essendo più semplici e meno flessibili, possono essere più facili da capire e da utilizzare per piccoli progetti o per rappresentare semplici aggregati di dati, ma diventano meno pratiche man mano che la complessità del progetto aumenta.

Sicurezza del Codice

L’incapsulamento fornito dalle classi permette una maggiore sicurezza del codice, poiché i dettagli interni di una classe possono essere nascosti e protetti dall’accesso esterno non autorizzato. Questo livello di protezione non è disponibile con le struct, che tendono a esporre tutti i loro membri pubblicamente.

Riferimenti