Dispositions et structures
Décrivez les dispositions de la mémoire native
Dispositions et structures est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.
Décrire la mémoire native
Les données natives se limitent rarement à une seule valeur. C utilise des structures, des tableaux et des unions. FFM modélise ces formes au moyen de dispositions mémoire, ce qui permet de lire et d’écrire en toute sécurité dans la mémoire native structurée.
La famille des dispositions
Les types de dispositions forment une petite hiérarchie :
ValueLayout: une valeur primitive (int, long, double, adresse)SequenceLayout: un tableau de taille fixe composé d’une dispositionStructLayout: des champs disposés séquentiellementUnionLayout: des champs qui se chevauchent
Une disposition de valeurs
Les dispositions les plus simples sont les dispositions de valeurs intégrées. Elles contiennent la taille, l’alignement et l’ordre des octets.
import java.lang.foreign.ValueLayout;
public class Main {
public static void main(String[] args) {
System.out.println("int size: " + ValueLayout.JAVA_INT.byteSize());
System.out.println("double size: " + ValueLayout.JAVA_DOUBLE.byteSize());
}
}Définir une structure
Modélisez une structure C avec MemoryLayout.structLayout(...), en nommant chaque champ avec withName. Prenons par exemple struct Point { int x; int y; }.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
StructLayout point = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("x"),
ValueLayout.JAVA_INT.withName("y"));
System.out.println("Point size: " + point.byteSize());
}
}Descripteurs de variables pour les champs
Pour lire ou écrire un champ nommé, dérivez un VarHandle au moyen d’une expression de chemin. groupElement("x") sélectionne le champ par son nom.
import java.lang.foreign.*;
import java.lang.invoke.VarHandle;
public class Main {
public static void main(String[] args) {
StructLayout point = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("x"),
ValueLayout.JAVA_INT.withName("y"));
VarHandle xHandle = point.varHandle(
MemoryLayout.PathElement.groupElement("x"));
System.out.println("Built VarHandle for x: " + xHandle);
}
}Lire et écrire une structure
Allouez un segment de la taille de la disposition, puis utilisez les descripteurs de variables pour définir et lire les champs. Cela reproduit le remplissage d’une structure C.
import java.lang.foreign.*;
import java.lang.invoke.VarHandle;
public class Main {
public static void main(String[] args) {
StructLayout point = MemoryLayout.structLayout(
ValueLayout.JAVA_INT.withName("x"),
ValueLayout.JAVA_INT.withName("y"));
VarHandle xh = point.varHandle(MemoryLayout.PathElement.groupElement("x"));
VarHandle yh = point.varHandle(MemoryLayout.PathElement.groupElement("y"));
try (Arena arena = Arena.ofConfined()) {
MemorySegment p = arena.allocate(point);
xh.set(p, 0L, 3);
yh.set(p, 0L, 4);
System.out.println("Point = (" + xh.get(p, 0L) + ", " + yh.get(p, 0L) + ")");
}
}
}Remplissage et alignement
Les compilateurs C insèrent du remplissage afin d’aligner les champs. FFM ne l’ajoute pas automatiquement ; vous devez donc inclure MemoryLayout.paddingLayout(n) pour correspondre exactement à la disposition C.
Un alignement incorrect corrompt chaque champ situé après l’espace ajouté.
Exemple de remplissage explicite
Pour struct { char c; int n; }, l’entier doit être aligné sur 4 octets ; 3 octets de remplissage suivent donc le caractère.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
StructLayout s = MemoryLayout.structLayout(
ValueLayout.JAVA_BYTE.withName("c"),
MemoryLayout.paddingLayout(3),
ValueLayout.JAVA_INT.withName("n"));
System.out.println("Aligned struct size: " + s.byteSize());
}
}Dispositions de séquence
Une SequenceLayout décrit un tableau. MemoryLayout.sequenceLayout(count, element) modélise, par exemple, un tableau de 10 nombres flottants de type double.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
SequenceLayout arr = MemoryLayout.sequenceLayout(10, ValueLayout.JAVA_DOUBLE);
System.out.println("Array bytes: " + arr.byteSize());
}
}Dispositions imbriquées
Les dispositions se composent entre elles. Une structure peut contenir une séquence, et une séquence peut contenir des structures. Des expressions de chemin telles que sequenceElement() et groupElement(name) permettent de parcourir des données imbriquées en profondeur.
Cela permet de gérer des structures de données C réelles, quelle que soit leur complexité.
Décalages et sous-segments
Vous pouvez interroger le byteOffset d’un champ à partir de son chemin et utiliser segment.asSlice(offset, size) pour obtenir un sous-segment, ce qui est utile pour transmettre un champ d’une structure à une fonction native.
Vérification rapide
Rappelez-vous un piège courant avec les structures.
Récapitulatif
Vous avez appris à décrire des données natives :
- Famille des dispositions :
ValueLayout,SequenceLayout,StructLayout,UnionLayout - Nommez les champs avec
withName; accédez-y viaVarHandleet les éléments de chemin - Ajoutez un
paddingLayoutexplicite pour obtenir le bon alignement - Composez des dispositions imbriquées et créez des sous-segments avec
asSlice
Le cours sur l’API des fonctions étrangères et de la mémoire est maintenant terminé.
Questions Fréquemment Posées
La leçon « Dispositions et structures » est-elle gratuite ?
Oui — le texte complet de « Dispositions et structures » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Dispositions et structures » ?
Décrivez les dispositions de la mémoire native Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Java Academy ?
Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Dispositions et structures » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?
Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Pourquoi FFM plutôt que JNI
- MemorySegment et Arena
- Handles d’appels descendants
- Dispositions et structures