0Pricing
Java Academy · Lezione

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 layout
  • StructLayout: campi disposti in sequenza
  • UnionLayout: 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 tramite VarHandle ed elementi di percorso
  • Aggiungere paddingLayout espliciti 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.

Tutte le lezioni di questo corso

  1. Perché FFM invece di JNI
  2. MemorySegment e Arena
  3. Handle per downcall
  4. Layout e struct
← Torna a Java Academy