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 letakStructLayout: anggota yang ditata secara berurutanUnionLayout: 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 melaluiVarHandledan elemen jalur - Tambahkan
paddingLayouteksplisit 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
- Mengapa FFM, bukan JNI
- MemorySegment dan Arena
- Handle Downcall
- Layout dan Struct