Layouts और Structs
Native memory layouts का वर्णन करें
Layouts और Structs, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
नेटिव मेमोरी का विवरण देना
नेटिव डेटा शायद ही कभी केवल एक मान होता है। C में स्ट्रक्चर, ऐरे और यूनियन का उपयोग होता है। FFM इन आकृतियों को मेमोरी लेआउट के ज़रिए मॉडल करता है, जिससे आप संरचित नेटिव मेमोरी को सुरक्षित रूप से पढ़ और लिख सकते हैं।
लेआउट परिवार
लेआउट प्रकार एक छोटी-सी पदानुक्रम बनाते हैं:
ValueLayout: एक आदिम मान (int, long, double, address)SequenceLayout: किसी लेआउट का निश्चित आकार वाला ऐरेStructLayout: क्रम से व्यवस्थित फ़ील्डUnionLayout: एक-दूसरे पर चढ़े हुए फ़ील्ड
वैल्यू लेआउट
सबसे सरल लेआउट पहले से बने हुए वैल्यू लेआउट होते हैं। इनमें आकार, संरेखण और बाइट क्रम की जानकारी होती है।
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());
}
}स्ट्रक्चर परिभाषित करना
MemoryLayout.structLayout(...) से किसी C स्ट्रक्चर का मॉडल बनाएँ और प्रत्येक फ़ील्ड का नाम withName से रखें। C के 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());
}
}फ़ील्ड के लिए VarHandle
नामित फ़ील्ड को पढ़ने या लिखने के लिए पाथ एक्सप्रेशन का उपयोग करके VarHandle प्राप्त करें। groupElement("x") नाम के आधार पर फ़ील्ड चुनता है।
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);
}
}स्ट्रक्चर पढ़ना और लिखना
लेआउट के आकार का सेगमेंट आवंटित करें, फिर फ़ील्ड के मान सेट और प्राप्त करने के लिए VarHandle का उपयोग करें। यह 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) + ")");
}
}
}पैडिंग और संरेखण
C कंपाइलर फ़ील्ड को संरेखित रखने के लिए पैडिंग जोड़ते हैं। FFM इसे अपने-आप नहीं जोड़ता, इसलिए C लेआउट से बिल्कुल मेल कराने के लिए आपको MemoryLayout.paddingLayout(n) शामिल करना होगा।
संरेखण गलत होने पर खाली स्थान के बाद का हर फ़ील्ड बिगड़ जाएगा।
स्पष्ट पैडिंग का उदाहरण
struct { char c; int n; } के लिए int को 4 बाइट पर संरेखित होना चाहिए, इसलिए char के बाद 3 पैडिंग बाइट आती हैं।
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());
}
}सीक्वेंस लेआउट
SequenceLayout किसी ऐरे का विवरण देता है। MemoryLayout.sequenceLayout(count, element) उदाहरण के लिए, 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());
}
}नेस्टेड लेआउट
लेआउट एक-दूसरे के साथ संयोजित किए जा सकते हैं। किसी स्ट्रक्चर में सीक्वेंस हो सकता है और किसी सीक्वेंस में स्ट्रक्चर हो सकते हैं। sequenceElement() और groupElement(name) जैसे पाथ एक्सप्रेशन नेस्टेड डेटा के भीतर गहराई तक जाने देते हैं।
इससे किसी भी जटिलता वाली वास्तविक C डेटा संरचनाओं को सँभाला जा सकता है।
ऑफ़सेट और स्लाइसिंग
आप किसी पाथ से फ़ील्ड का byteOffset प्राप्त कर सकते हैं और उप-सेगमेंट पाने के लिए segment.asSlice(offset, size) का उपयोग कर सकते हैं। यह किसी स्ट्रक्चर के एक फ़ील्ड को नेटिव फ़ंक्शन में देने के लिए उपयोगी है।
त्वरित जाँच
स्ट्रक्चर के साथ होने वाली एक सामान्य समस्या याद करें।
पुनरावलोकन
आपने नेटिव डेटा का विवरण देना सीखा:
- लेआउट परिवार:
ValueLayout,SequenceLayout,StructLayout,UnionLayout withNameसे फ़ील्ड के नाम रखें;VarHandleऔर पाथ एलिमेंट के ज़रिए ऐक्सेस करें- सही संरेखण के लिए स्पष्ट
paddingLayoutजोड़ें - नेस्टेड लेआउट संयोजित करें और
asSliceसे स्लाइस बनाएँ
इससे Foreign Function और Memory API पाठ्यक्रम पूरा होता है।
एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 104
- पाठ
- 374
अक्सर पूछे जाने वाले प्रश्न
क्या “Layouts और Structs” पाठ निःशुल्क है?
हाँ—“Layouts और Structs” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Layouts और Structs” में मैं क्या सीखूँगा?
Native memory layouts का वर्णन करें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“Layouts और Structs” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- JNI के बजाय FFM क्यों
- MemorySegment और Arena
- Downcall Handles
- Layouts और Structs