0Pricing
Java Academy · Pelajaran

Layout dan Struct

Deskripsikan layout memori native.

Layout dan Struct adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Mendeskripsikan Memori Natif

Data natif jarang hanya berupa satu nilai. C menggunakan struktur, larik, dan union. FFM memodelkan bentuk-bentuk ini dengan tata letak memori, sehingga Anda dapat membaca dan menulis memori natif terstruktur dengan aman.

Keluarga Tata Letak

Jenis-jenis tata letak membentuk hierarki kecil:

  • ValueLayout: nilai primitif (int, long, double, alamat)
  • SequenceLayout: larik berukuran tetap dari suatu tata letak
  • StructLayout: anggota yang ditata secara berurutan
  • UnionLayout: anggota yang saling menimpa

Tata Letak Nilai

Tata letak yang paling sederhana adalah tata letak nilai bawaan. Tata letak ini membawa informasi tentang ukuran, penyelarasan, dan urutan 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());
    }
}

Mendefinisikan Struktur

Modelkan struktur C dengan MemoryLayout.structLayout(...), lalu beri nama setiap anggota dengan withName. Pertimbangkan struct Point { int x; int y; } dalam 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 untuk Anggota

Untuk membaca atau menulis anggota yang diberi nama, buat VarHandle menggunakan ekspresi jalur. groupElement("x") memilih anggota berdasarkan namanya.

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);
    }
}

Membaca dan Menulis Struktur

Alokasikan segmen dengan ukuran sesuai tata letak, lalu gunakan var handle untuk menetapkan dan mendapatkan nilai anggota. Cara ini menyerupai pengisian struktur 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) + ")");
        }
    }
}

Ruang Pengisi dan Penyelarasan

Kompilator C menyisipkan ruang pengisi agar anggota terselaraskan. FFM tidak menambahkannya secara otomatis, jadi Anda harus menyertakan MemoryLayout.paddingLayout(n) agar benar-benar sesuai dengan tata letak C.

Kesalahan penyelarasan akan merusak setiap anggota setelah celah tersebut.

Contoh Ruang Pengisi Eksplisit

Untuk struct { char c; int n; }, nilai integer harus terselaraskan pada 4 byte, sehingga 3 byte pengisi mengikuti karakter tersebut.

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());
    }
}

Tata Letak Urutan

SequenceLayout mendeskripsikan sebuah larik. MemoryLayout.sequenceLayout(count, element) dapat memodelkan, misalnya, larik yang berisi 10 nilai 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());
    }
}

Tata Letak Bertingkat

Tata letak dapat disusun. Sebuah struktur dapat berisi urutan, dan urutan dapat berisi struktur. Ekspresi jalur seperti sequenceElement() dan groupElement(name) menavigasi data bertingkat secara mendalam.

Dengan cara ini, struktur data C di dunia nyata dengan tingkat kerumitan apa pun dapat ditangani.

Offset dan Pengirisan

Anda dapat meminta byteOffset suatu anggota dari jalurnya dan menggunakan segment.asSlice(offset, size) untuk mendapatkan segmen bagian, yang berguna untuk meneruskan satu anggota struktur ke fungsi natif.

Pemeriksaan Singkat

Ingat kembali kesalahan umum pada struktur.

Ringkasan

Anda telah mempelajari cara mendeskripsikan data natif:

  • Keluarga tata letak: ValueLayout, SequenceLayout, StructLayout, UnionLayout
  • Beri nama anggota dengan withName; akses melalui VarHandle dan elemen jalur
  • Tambahkan paddingLayout eksplisit untuk penyelarasan yang benar
  • Susun tata letak bertingkat dan iris dengan asSlice

Dengan ini, kursus Foreign Function and Memory API selesai.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Layout dan Struct” gratis?

Ya — teks lengkap “Layout dan Struct” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Layout dan Struct”?

Deskripsikan layout memori native. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Layout dan Struct” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengapa FFM, bukan JNI
  2. MemorySegment dan Arena
  3. Handle Downcall
  4. Layout dan Struct
← Kembali ke Java Academy