Layout e struct
Descrivere i layout della memoria nativa
Layout e struct è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
Descrizione della memoria nativa
I dati nativi raramente sono costituiti da un singolo valore. C usa struct, array e union. FFM modella queste strutture con i layout di memoria, consentendo di leggere e scrivere in modo sicuro la memoria nativa strutturata.
Famiglia dei layout
I tipi di layout formano una piccola gerarchia:
ValueLayout: un tipo primitivo (int, long, double, address)SequenceLayout: un array di dimensione fissa di un layoutStructLayout: campi disposti in sequenzaUnionLayout: campi sovrapposti
Un layout di valore
I layout più semplici sono i layout di valore predefiniti. Includono dimensione, allineamento e ordine dei byte.
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());
}
}Definizione di una struct
Si modella una struct C con MemoryLayout.structLayout(...), assegnando un nome a ogni campo con withName. Si consideri struct Point { int x; int y; } in C.
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());
}
}VarHandle per i campi
Per leggere o scrivere un campo denominato, si deriva un VarHandle usando un'espressione di percorso. groupElement("x") seleziona il campo in base al nome.
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);
}
}Lettura e scrittura di una struct
Allochi un segmento delle dimensioni del layout, quindi usi i var handle per impostare e leggere i campi. Questo rispecchia la compilazione di una struct 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) + ")");
}
}
}Padding e allineamento
I compilatori C inseriscono il padding per allineare i campi. FFM non lo aggiunge automaticamente, quindi è necessario includere MemoryLayout.paddingLayout(n) per corrispondere esattamente al layout C.
Un allineamento errato corrompe ogni campo successivo allo spazio di padding.
Esempio di padding esplicito
Per struct { char c; int n; }, l'int deve essere allineato su 4 byte, quindi dopo il char seguono 3 byte di padding.
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());
}
}Layout di sequenza
Un SequenceLayout descrive un array. MemoryLayout.sequenceLayout(count, element) modella, ad esempio, un array di 10 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());
}
}Layout annidati
I layout sono componibili. Una struct può contenere una sequenza e una sequenza può contenere struct. Le espressioni di percorso come sequenceElement() e groupElement(name) consentono di navigare nei dati annidati.
In questo modo è possibile gestire strutture dati C del mondo reale, di complessità arbitraria.
Offset e slicing
È possibile ottenere il byteOffset di un campo dal relativo percorso e usare segment.asSlice(offset, size) per ottenere un sotto-segmento, utile per passare un singolo campo di una struct a una funzione nativa.
Verifica rapida
Ricordi una trappola comune con le struct.
Riepilogo
Ha appreso a descrivere i dati nativi:
- Famiglia dei layout:
ValueLayout,SequenceLayout,StructLayout,UnionLayout - Assegnare nomi ai campi con
withName; accedervi tramiteVarHandleed elementi di percorso - Aggiungere
paddingLayoutespliciti per ottenere il corretto allineamento - Comporre layout annidati e creare sezioni con
asSlice
Con questo si conclude il corso sull'API Foreign Function and Memory.
Domande Frequenti
La lezione «Layout e struct» è gratuita?
Sì — il testo completo di «Layout e struct» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «Layout e struct»?
Descrivere i layout della memoria nativa Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Layout e struct»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.