سؤال

لماذا لا منطقية تستهلك 4 بايت و شار 2 بايت في .NET framework ؟ منطقية يجب أن تأخذ 1bit أو على الأقل أن تكون أصغر من شار.

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

المحلول

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

ويجب عليك استخدام المتغيرات 2 بايت فقط عندما الذاكرة مصدر قلق أكبر من السرعة. وهذا هو السبب في شار (والذي هو Unicode في .NET) يأخذ اثنين بايت بدلا من أربعة.

نصائح أخرى

عن boolean

معظم إجابات أخرى على الانحياز و السرعة هو السبب مبرمج يجب أن يلتزم الباحث عن حلقة عدادات لم المترجم يمكن أن تجعل بايت 4-بايت واسعة.كل من التفكر في الحقيقة تنطبق بايت و قصيرة وكذلك منطقية.

في C# على الأقل منطقي (أو نظام.منطقية) هو 1 بايت واسعة هيكل مدمج ، والتي يمكن أن يكون تلقائيا محاصر ، بحيث يكون لديك كائن (الذي يحتاج إلى ذاكرة الكلمات أن تكون ممثلة على الأقل ، أي8/16 بايت على 32/64 بت البيئات على التوالي) مع حقل (بايت واحد على الأقل) بالإضافة إلى ذاكرة واحدة كلمة تشير إلى ذلك ، أيفي المجموع على الأقل 13/25 بايت.

هذا هو في الواقع 1 Google الدخول على "C# أنواع بدائية".http://msdn.microsoft.com/en-us/library/ms228360(مقابل.80).aspx

أيضا نقلت الرابط (http://geekswithblogs.net/cwilliams/archive/2005/09/18/54271.aspx) أيضا الدول التي منطقية ، CLI القياسية ، يأخذ 1 بايت.

في الواقع, ومع ذلك, المكان الوحيد هذا هو مرئي على صفائف من القيم المنطقية - ن القيم المنطقية تأخذ n بايت.في حالات أخرى ، منطقية قد يأخذ 4 بايت.

  • داخل هيكل معظم أوقات التشغيل (كما في جاوة) من شأنه أن يجعل جميع المجالات إلى 4 بايت الأداء.في مونتي JVM على الأجهزة المدمجة هي حكمة أعتقد أنه إعادة ترتيب الحقول على النحو الأمثل.
    • في الإطار المحلي/المعامل كومة مترجم, في معظم التنفيذ الأداء كومة واحدة دخول أحد الذاكرة-كلمة واسعة (وربما على .صافي يجب أن يكون 64 بت واسعة لدعم مزدوجة طويلة ، والتي على .صافي يستخدم فقط 1 كومة الدخول بدلا من 2 في جافا).مترجم JIT يمكن بدلا من ذلك استخدام 1 بايت المنطقية المحليين مع الحفاظ على الأخرى فأر الانحياز من خلال إعادة ترتيب الحقول دون تأثير الأداء ، إذا كان مقدار حمل إضافي يستحق ذلك.

عن char

char هما بايت لأنه عندما دعم تدويل مطلوب, باستخدام اثنين بايت الشخصيات داخليا هو الرهان الأكثر أمانا.هذا ليس له صلة مباشرة اختيار دعم يونيكود ، ولكن خيار التمسك UTF-16 و الأساسي متعدد اللغات الطائرة.في Java و C#, يمكنك أن تفترض كل الوقت الذي منطقي واحد شار تناسبها في متغير من نوع char.

وذلك لأن في بيئة 32 بت، وحدة المعالجة المركزية يمكن التعامل مع قيم 32 بت أسرع من قيم 8 بت أو 16 بت، لذلك هذا هو سرعة / حجم المقايضة. إذا كان لديك لحفظ الذاكرة وكان لديك كمية كبيرة من bools، ومجرد استخدام <م> UINT الصورة وحفظ القيم المنطقية ك بت من 4 بايت <م> UINT الصورة. حرف 2 بايت واسعة نظرا لأنها تخزين أحرف Unicode 16 بت.

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

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

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

ولقد وجدت هذا: "في الواقع، منطقية هو 4 بايت، لا 2. والسبب هو أن هذا ما يدعم CLR لمنطقية أعتقد أن هذا ما تقوم به ل32 بت القيم هي أكثر بكثير من كفاءة للتلاعب، وبالتالي فإن الوقت / المقايضة الفضاء، بصورة عامة، يستحق كل هذا العناء. يجب عليك استخدام فئة ناقلات بت (نسيان حيث هو) إذا كنت بحاجة إلى مربى حفنة من البتات معا ... "

ومكتوب من قبل بول ويك في http://geekswithblogs.net /cwilliams/archive/2005/09/18/54271.aspx

وقبل كل شيء يجب عليك استخدام التعريف لتحديد أين كان لديك مشكلة الذاكرة، IMHO.

والذاكرة ليست سوى قلق إذا كان لديك مجموعة كبيرة من البتات، في هذه الحالة يمكنك استخدام فئة System.Collections.BitArray.

ولها لأنه قد يستخدم ويندوز وصافي يونيكود <لأ href = "HTTP: / /en.wikipedia.org/wiki/UTF-16 "يختلط =" نوفولو noreferrer "> (UTF 16) منذ البداية بصفتها مجموعة طابعها الداخلي. UTF يستخدم 16 2 بايت لكل حرف أو زوج من 2 الكلمات بايت لكل حرف ولكن فقط إذا لزم الأمر كما هو متغير ترميز عرض .

و"للشخصيات الأساسية في الطائرة متعدد اللغات (BMP) الترميز الناتج هو واحد كلمة 16 بت للحصول على الأحرف في طائرات أخرى، فإن الترميز يؤدي إلى زوج من الكلمات 16 بت"

سوف

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

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