November 15, 2025 (4mo ago) — last updated January 31, 2026 (2mo ago)

Classes vs structs : quand choisir

Comparez classes et structs : sémantique valeur vs référence, impact mémoire et performance, et règles pratiques pour choisir le bon type.

← Back to blog
Cover Image for Classes vs structs : quand choisir

Choisir entre classes et structs commence par la sémantique : voulez-vous des copies indépendantes (type par valeur) ou une identité partagée (type par référence) ? Ce guide explique les conséquences sur la mémoire, la performance et la conception, et propose des règles pratiques et exemples concrets pour décider.

Classes vs structs : quand choisir

Résumé : Comparez classes et structs en termes de sémantique, mémoire, performance et bonnes pratiques pour choisir le bon type dans votre code.

Introduction

Choisir entre classes et structs commence par la sémantique : voulez-vous des copies indépendantes (type par valeur) ou une identité partagée (type par référence) ? Cette décision influence la mémoire, la performance, la mutabilité et l’architecture. Ce guide explique ces compromis, donne des règles pratiques et des exemples pour vous aider à décider rapidement et en toute confiance.

La différence essentielle : valeur vs référence

Un programmeur comparant des blocs de code pour classes et structures sur un grand écran.

Pensez au struct comme à une copie indépendante des données : chaque copie peut être modifiée sans impacter l’original. La class représente un objet partagé, accessible par référence, où plusieurs parties du code manipulent la même instance.

Comparaison rapide

CaractéristiqueStructs (valeur)Classes (référence)
PassageLes données sont copiéesUne référence (pointeur) est passée
AllocationSouvent en ligne ou sur la pileAlloué sur le tas
Durée de vieCopies locales, courte portéeInstances durables, partageables
IdentitéIdentité = donnéesIdentité propre, indépendante des données
HéritageRarement utiliséHéritage et polymorphisme possibles
Usage typiquePetites valeurs autonomesEntités complexes avec identité

Ces choix ont des conséquences sur la latence et la maintenabilité du code.

Mémoire et performance : pile vs tas

Un schéma montrant la différence entre l'allocation mémoire sur la pile et sur le tas.

La pile est rapide et prévisible, le tas est plus flexible mais plus coûteux en gestion. Les allocations répétées sur le tas augmentent la pression sur le ramasse-miettes dans les environnements managés1, et la localité de cache influence fortement la vitesse des boucles intensives2.

La pile — allocation rapide

La pile suit une logique LIFO : l’allocation et la désallocation sont peu coûteuses. Pour de petits types par valeur, l’overhead est faible et la localité mémoire est meilleure.

Le tas — flexible mais plus lourd

Le tas permet aux objets de survivre hors de la portée d’une fonction, mais l’allocation et la collecte coûtent plus cher et peuvent déclencher le GC plus souvent1. Les objets référencés sur le tas introduisent une indirection : la pile contient un pointeur vers des données éloignées en mémoire, ce qui peut dégrader la performance sur de gros traitements2.

Exemple C#

// Type valeur — souvent en ligne
public struct PointStruct {
    public int X;
    public int Y;
}

// Type référence — objet sur le tas
public class PointClass {
    public int X;
    public int Y;
}

public void ProcessPoints() {
    PointStruct p1 = new PointStruct { X = 10, Y = 20 };
    PointClass p2 = new PointClass { X = 10, Y = 20 };
}

Dans des boucles serrées, des structs bien conçus réduisent la pression sur le GC et améliorent la localité de cache, ce qui accélère le traitement de grandes quantités de données12.

Comment les langages traitent classes et structs

Un écran partagé montrant des extraits de code de différents langages de programmation, illustrant classes et structures.

Chaque langage a ses idiomes et ses recommandations.

C++

En C++, struct et class sont très proches, la seule différence étant la visibilité par défaut. On utilise souvent struct pour des agrégats de données et class pour encapsuler le comportement3.

C#

C# sépare explicitement valeur et référence : struct pour de petites valeurs (idéalement immuables), class pour des entités avec identité et état mutable. Les structs peuvent implémenter des interfaces et avoir des méthodes, mais attention à leur taille lors des copies.

Swift

Swift privilégie souvent les types par valeur, et réserve class aux cas nécessitant la sémantique de référence, comme l’état partagé ou l’interopérabilité Objective-C4.

Rust

Rust utilise struct avec un modèle d’ownership et d’emprunt, offrant sécurité mémoire à la compilation sans ramasse-miettes5.

struct Player {
    username: String,
    level: u32,
    is_active: bool,
}

impl Player {
    fn level_up(&mut self) {
        self.level += 1;
    }
}

Quand choisir un struct

Choisissez un struct quand le type est petit, autonome et traité comme une valeur. Exemples :

  • Points 2D
  • Couleurs (RGB/RGBA)
  • Petits payloads de configuration
  • Entrées de calcul légères

Avantages : moins d’allocations sur le tas, meilleure localité de cache et moins de pression sur le GC dans les environnements managés12.

Quand choisir une class

Choisissez une class quand l’objet a une identité stable, un état partagé mutable, ou besoin d’héritage et de polymorphisme. Exemples :

  • Profils utilisateurs et entités métier
  • Connexions réseau ou base de données
  • Services et gestionnaires qui coordonnent l’état

Les classes facilitent les patterns orientés objet et la modélisation d’interactions complexes.

Liste de contrôle décisionnelle

ConsidérationUtiliser struct (valeur)Utiliser class (référence)
IdentitéLes données définissent l’entitéL’objet a une identité unique
MutabilitéImmuable ou petit état isoléÉtat partagé et mutable
ComportementLogique simple liée aux donnéesInteractions et comportements complexes
Durée de vieCourte, portée localeLongue, application entière
PartageSûr à copierDoit être partagé par référence

Questions fréquentes

Un struct peut-il avoir des méthodes ?

Oui. C#, Swift et Rust permettent aux structs d’avoir des méthodes, des initialiseurs et d’implémenter des interfaces ou protocoles. La différence reste la façon dont ils sont copiés et passés.

Les structs sont-ils toujours plus rapides ?

Non. Les petits structs sont souvent plus rapides, mais les grands structs peuvent coûter cher à copier. Profilez de vrais workloads avant de généraliser.

Les structs supportent-ils l’héritage ?

Généralement non. Les structs offrent rarement l’héritage classique, mais peuvent implémenter des interfaces ou protocoles pour obtenir une composition flexible.

Q&R pratiques (résumé)

Q : Quand refactoriser une classe en struct ?

R : Quand le type est une petite valeur immuable sans identité et que vous voulez réduire les allocations sur le tas.

Q : Comment éviter les pauses du GC dans les environnements managés ?

R : Réduisez les allocations temporaires sur le tas en préférant les structs pour les petites valeurs, réutilisez les objets et utilisez des pools ; mesurez le GC sous charge1.

Q : Quelle règle simple retenir ?

R : Si c’est « une valeur », utilisez un struct ; si c’est « une chose avec une identité », utilisez une class.

Trois questions-réponses concises

Q1 : Les structs évitent-ils les bugs d’état partagé ?

A1 : Oui, leur sémantique de valeur limite les mutations partagées, ce qui réduit certains bugs de concurrence.

Q2 : Les structs améliorent-ils toujours la performance ?

A2 : Pas toujours. Ils aident surtout pour de petites valeurs fréquemment allouées ; évitez les grands structs coûteux à copier.

Q3 : Quand privilégier la class ?

A3 : Quand l’identité, la durée de vie ou l’héritage sont nécessaires.


Chez Clean Code Guy, nous aidons les équipes à refactorer pour la scalabilité et la maintenabilité. En savoir plus sur https://cleancodeguy.com.

1.
Microsoft Docs. “Garbage collection performance and tuning.” https://learn.microsoft.com/dotnet/standard/garbage-collection/
2.
Ulrich Drepper. “What Every Programmer Should Know About Memory.” https://people.freebsd.org/~lstewart/articles/cpumemory.pdf
3.
cppreference.com. “class vs struct.” https://en.cppreference.com/w/cpp/language/class
4.
Apple. “Structures and Classes” (Swift Programming Language). https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html
5.
The Rust Programming Language. “Ownership.” https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html
← Back to blog
🙋🏻‍♂️

L’IA écrit du code.
Vous le faites durer.

À l’ère de l’accélération de l’IA, le code propre n’est pas seulement une bonne pratique — c’est la différence entre les systèmes qui évoluent et les codebases qui s’effondrent sous leur propre poids.