سؤال

عند تحتاج إلى أن يكون أشياء صغيرة جدا، ويقول أن يحتوي على 2 خاصية الطفو، وسيكون لديك الملايين منهم أن لا سيصبح "دمرت" على الفور، والبنيات اختيار أو فئات أفضل؟

وكما هو الحال في XNA كمكتبة، هناك point3s، الخ كما البنيات لكن اذا كنت بحاجة الى التمسك بهذه القيم لفترة طويلة، فإنه يشكل تهديدا الأداء؟

هل كانت مفيدة؟

المحلول

وخلافا لمعظم الأسئلة حول البنيات، وهذا يبدو في الواقع أن يكون من حسن استخدام البنية. إذا كانت البيانات التي يتضمنها هي أنواع القيمة، وأنت ذاهب إلى استخدام الكثير من هذه، فإن هيكل تعمل بشكل جيد.

وبعض النصائح:

و:: لا ينبغي أن تكون البنية أكبر من 16 بايت، أو تفقد مزايا الأداء.

و:: كن البنية غير قابل للتغيير. وهذا يجعل استخدام أكثر وضوحا.

مثال:

public struct Point3D {

   public float X { get; private set; }
   public float Y { get; private set; }
   public float Z { get; private set; }

   public Point3D(float x, float y, float z) {
      X = x;
      Y = y;
      Z = z;
   }

   public Point3D Invert() {
      return new Point3D(-X, -Y, -Z);
   }

}

نصائح أخرى

والجواب يعتمد على المكان / في نهاية المطاف سيتم تخزين الكائنات القيم. إذا أريد لها أن تكون مخزنة في جمع بلا نوع مثل ArrayList، ثم ينتهي بك الأمر الملاكمة لهم. الملاكمة يخلق المجمع الكائن للبنية والبصمة هي نفسها كما هو الحال مع كائن فئة. من ناحية أخرى إذا كنت تستخدم مجموعة مكتوب مثل T [] أو قائمة، ثم استخدام البنيات سيتم تخزين البيانات فقط الفعلية لكل عنصر مع البصمة لجمع كامل فقط وليس عناصرها.

وهكذا البنيات أكثر كفاءة لاستخدامها في T [] المصفوفات.

والقلق الكبير هو ما إذا كان تخصيص الذاكرة على المكدس أو كومة. البنيات تذهب في كومة افتراضيا، وكومة عموما أكثر محدودية بكثير من حيث المساحة. لذلك خلق في مجمله مجموعة من البنيات تماما مثل ذلك يمكن أن يكون مشكلة.

في الواقع، على الرغم من أنني لا أعتقد حقا فهو أن يبلغ حجم الصفقة. إذا كان لديك أن العديد منهم أنهم جزء من المرجح مثيل فئة (على كومة) في مكان ما.

والبنية يبدو الصحيحة لهذا التطبيق.

ونضع في اعتبارنا أن "الحاجة إلى التمسك بهذه القيم" يعني التخزين الخاصة بهم على كومة مكان ما، وربما حقل مجموعة من مثيل فئة.

وشيء واحد أن احترس من أن هذا يؤدي إلى تخصيص على كومة كائن كبير. وليس ذلك واضحا كيف، على كل حال، هذه الكومة defrags نفسها، ولكن لكائنات عاشت فترة طويلة جدا ربما ليست قضية.

وعن طريق الطبقة بالنسبة للملايين من هذه الأنواع من البيانات من المرجح أن تكون مكلفة في حجم القص من dereferencing التي من المرجح أن تجري عمليات على هذا النوع.

وكقاعدة عامة، صفائف كبيرة من البيانات غير مستعارة (أي غير مشترك) من نفس النوع هو أفضل تخزينها في البنيات للأداء منذ أن تقلل من عدد من المراوغات. (انظر أيضا عندما، هي، البنيات رأس الجواب ). الفرق الأداء المحدد بين الطبقة والبنية يعتمد على الاستخدام الخاص بك. (على سبيل المثال، في العمليات، هل فقط أجزاء صول البنية؟ هل لديك الكثير من النسخ مؤقت؟ إذا كان بنية صغيرة هو على الأرجح الأفضل دائما للاستخدام ولكن اذا كان كبير، وخلق نسخ مؤقتة قد كنت بطيئا، وإذا كنت جعله غير قابل للتغيير سيكون لديك لنسخ دائما كل شيء لتغيير القيمة).

وعندما تكون في شك، التدبير.

ومنذ كنت مهتما في الآثار المحتملة على المدى الطويل التي قد لا تكون واضحة من قبل مثل هذا القياس، أن ندرك أن هذه المصفوفات ومن المرجح المخزنة على كومة كائن كبير ويجب إعادة استخدامها بدلا من تدمير وتخصيص إعادة . (انظر CRL الداخل إلى الخارج: كائن كبير كومة وكشف .)

عند تمرير البنيات بحجم أكبر في المكالمات التي قد ترغب في تمرير لهم حجة المرجع لتجنب النسخ.

وأنواع القيمة (البنية) هي جيدة لنوع التي لم يتم تخصيصها على كومة كثير من الأحيان، وهذا هو، وترد في الغالب هم في إشارة أو قيمة من نوع آخر.

والمثال الذي أعطيته Vector3 خير مثال. سيكون لديك نادرا التعلق Vector3 في كومة، وأنها سترد أكثر من مرة في النوع الذي هو في حد ذاته في كومة، أو تستخدم كمتغير المحلية، وفي هذه الحالة، سيتم تخصيصها على المكدس.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top