इसलिए सी ++ में यह बहुत आसान है। आप ढेर पर आवंटित किए जाने वाले वर्ग/संरचना को चाहते हैं, नया उपयोग करें। यदि आप इसे ढेर पर चाहते हैं, तो नए का उपयोग न करें।सी # structs/वर्ग ढेर/ढेर नियंत्रण?
सी # में हम हमेशा नए कीवर्ड का उपयोग करते हैं, और इस पर निर्भर करता है कि यह एक संरचना या कक्षा है या तो इसे ढेर या ढेर पर आवंटित किया गया है (structs ढेर पर जाते हैं, ढेर तक कक्षाएं) - और कुछ अनुप्रयोगों में डिजाइन को बदलते समय एक बड़ा प्रदर्शन अंतर हो सकता है जैसे कि केवल वे वस्तुएं ही ढेर पर जाती हैं जो वास्तव में वहां होती है।
मुझे आश्चर्य है कि क्या यह नियंत्रित करने का एक सीधा तरीका है कि किसी ऑब्जेक्ट को आवंटित किया जाता है चाहे इसे संरचना या कक्षा के रूप में घोषित किया गया हो? मुझे पता है कि ढेर पर जाने के लिए मूल्य प्रकार (structs) को बॉक्स किया जा सकता है (लेकिन मुक्केबाजी/अनबॉक्सिंग एक प्रदर्शन लागत पर आता है)। क्या ढेर पर कक्षा आवंटित करने का कोई तरीका है?
इसके अलावा, क्या कच्ची मेमोरी आवंटित करने और सी ++ में प्लेसमेंट जैसे कुछ का उपयोग करने के लिए कोई तंत्र है? मुझे पता है कि यह प्रबंधित होने के विचार से टूटता है - लेकिन यदि आप अपने कस्टम मेमोरी प्रबंधन का उपयोग कर सकते हैं तो यह एक बड़ा प्रदर्शन अंतर कर सकता है।
मुझे इसकी सुविधा के लिए सी # पसंद है, क्योंकि यह कचरा कलेक्टर और अन्य चीजों के लिए है - लेकिन कभी-कभी, किसी एप्लिकेशन की बाधा पर काम करते समय, यह वास्तव में क्या हो रहा है पर अधिक नियंत्रण रखने के लिए वांछनीय होना चाहिए।
कोई युक्ति/संकेत :) का स्वागत करते हैं
संपादित करें: प्रदर्शन उदाहरण:
struct Foo1
{
public int i;
public float f;
public double d;
}
struct Foo2
{
public Foo1[] bar;
public void Init(){
bar = new Foo1[100];
for (int i = 0; i < 100; i++)
bar[i] = new Foo1();
}
}
class Program
{
static void Main(string[] args)
{
DateTime time = DateTime.Now;
Foo2[] arr = new Foo2[1000000];
for (int i = 0; i < 1000000; i++)
{
arr[i] = new Foo2();
arr[i].Init();
}
Console.WriteLine((DateTime.Now - time).TotalMilliseconds);
}
}
इस पर अमल करने के लिए अपने मशीन पर 1.8 सेकंड लेता है (ध्यान दें कि वास्तव में केवल आवंटन पर जा रहा है - कोई पैरामीटर गुजर)
यदि फ़ू 1 को संरचना से कक्षा में बदल दिया गया है, तो निष्पादन 8.9 सेकेंड लगता है! यह पांच गुना धीमा है
आपको क्या लगता है कि ढेर बनाम ढेर पर ऑब्जेक्ट आवंटित करने के बीच एक * विशाल * प्रदर्शन अंतर है? – LBushkin
मैंने देखा कि जब मैंने एक 3 डी गेम के लिए भौतिकी सॉल्वर लागू किया था - मैं ऑब्जेक्ट आवंटित किए गए कार्यों से जुड़े सावधानीपूर्वक बदलकर और – Mat
में वस्तुओं को कैसे पारित कर सकता हूं, आप प्रदर्शन को काफी हद तक अनुकूलित कर सकते हैं। आप जानते हैं कि ढेर और ढेर अनिवार्य रूप से हैं स्मृति का एक ही ब्लॉक (एक तरफ कैशिंग), आवंटन एक सूचक है जो आप आधार के रूप में संदर्भित करते हैं। क्षमा करें, क्लासिक स्टैक/ढेर को साफ़ करने के लिए अनिवार्य रूप से स्मृति का एक ही ब्लॉक – GrayWizardx