سؤال

ومؤخرا، وأنا وطعن في مقابلة أجراها مؤخرا مع مشكلة معالجة سلسلة طلب لتحسين الأداء. اضطررت لاستخدام مكرر للانتقال ذهابا وإيابا بين الأحرف TCHAR (مع دعم UNICODE - 2bytes لكل منهما).

وليس التفكير حقا من طول المصفوفة، لقد ارتكبت خطأ curial مع عدم استخدام size_t لكن كثافة تكرار خلال. وأنا أفهم أنه غير متوافق وغير آمنة.

int i, size = _tcslen(str);    
for(i=0; i<size; i++){
   // code here
}

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

وعلى سبيل المثال: وبدون أي أدوات رسم الخرائط الافتراضية، يمكننا أن الخريطة فقط 2 بايت ^ تسجيل الحجم. منذ TCHAR هو 2 بايت، نصف هذا العدد. للحصول على أي نظام يحتوي الباحث إلى 32 بت، وهذا لن يكون مشكلة حتى لو كنت لا تستخدم إصدارا غير موقعة من كثافة العمليات. الناس مع خلفية جزءا لا يتجزأ من استخدامها لنفكر في كثافة العمليات إلى 16 بت، ولكن سيقتصر حجم الذاكرة على مثل هذا الجهاز. لذلك أنا أتساءل عما إذا كان هناك قرار صقل المعماري بين عدد صحيح وتسجيل الأحجام.

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

المحلول

والمعيار C ++ لا يحدد حجم وكثافة العمليات. (وتقول أن sizeof(char) == 1، وsizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long).

وحتى لا يكون هناك لا على هل لديك لتكون علاقة لتسجيل حجم. وتنفيذ مطابق تماما C ++ يمكن أن تعطيك 256 الأعداد الصحيحة بايت على جهاز الكمبيوتر الخاص بك مع سجلات 32 بت. لكنها تريد ان تكون غير فعالة.

ولذا نعم، من الناحية العملية، وحجم نوع البيانات int يساوي عادة إلى حجم سجلات للأغراض العامة وحدة المعالجة المركزية، لأن ذلك هو إلى حد بعيد الخيار الأكثر كفاءة.

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

و(بعض اللغات تتطلب مجرد int أن يتم اختيار 32 بت، وفي هذه الحالة هناك ومن الواضح أن لا علاقة لتسجيل حجم --- غير أن 32 بت لأنه هو حجم سجل مشترك)

نصائح أخرى

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

وAFAIK، ليست هناك صلة مباشرة بين حجم السجل وحجم كثافة العمليات.

ولكن، منذ كنت تعرف على النظام الأساسي الذي كنت تجميع التطبيق، يمكنك تحديد نوع الخاصة بك اسم مستعار مع أحجام تحتاج:

مثال

#ifdef WIN32 // Types for Win32 target
#define Int16 short
#define Int32 int
// .. etc.
#elif defined // for another target

وبعد ذلك، استخدام الأسماء المستعارة المعلنة.

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

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

ولذا فإن أفضل تخمين - دون معرفة architectore - speeedwise غير، لاستخدام تسجيل [إينتس] الحجم، طالما يمكنك تحمل الذاكرة

وأنا لم يكن لديك نسخة من مستوى، ولكن نسختي القديمة <م> والبرمجة C اللغة يقول من (القسم 2.2) int يشير إلى "عدد صحيح، وعادة ما يعكس حجم الطبيعي من الأعداد الصحيحة على الجهاز المضيف ". نسختي من وC ++ لغة برمجة يقول (القسم 4.6) "من المفترض نوع int أن يتم اختياره ليكون الأنسب لعقد والتلاعب الأعداد الصحيحة على جهاز كمبيوتر معين."

وأنت لست الشخص الوحيد الذي يقول "أنا أعترف أن <لأ href =" http://www.matasano.com/log/31/georgi-guninskis-500/ "يختلط =" نوفولو noreferrer " > هذا من الناحية الفنية عيب، ولكنها ليست حقا للاستغلال . "

وهناك أنواع مختلفة من السجلات ذات أحجام مختلفة. ما المهم هي سجلات عنوان، وليس الغرض منها العامة. إذا كان الجهاز 64 بت، ثم سجلات عنوان (أو مزيج منها) يجب أن يكون 64-بت، حتى لو كانت سجلات الأغراض العامة هي 32 بت. في هذه الحالة، قد يكون مترجم للقيام ببعض العمل الإضافي لحساب فعلا عناوين 64 بت متعددة باستخدام سجلات للأغراض العامة.

إذا كنت لا أعتقد أن الشركات المصنعة للأجهزة جعل من أي وقت مضى خيارات التصميم ونيف لسجلاتها، فإنك ربما لم يكن للتعامل مع الأصلي 8086 "<لأ href =" http://en.wikipedia.org/wiki/ Real_mode "يختلط =" نوفولو noreferrer "> الوضع الحقيقي " معالجة.

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