هل من الضروري الضرب بحجم (char) عند معالجة الذاكرة؟

StackOverflow https://stackoverflow.com/questions/1011806

سؤال

عند استخدام malloc والقيام بمعالجة مماثلة للذاكرة، هل يمكنني الاعتماد على أن يكون sizeof(char) دائمًا 1؟

على سبيل المثال، أحتاج إلى تخصيص ذاكرة لعناصر N من النوع char.يتم الضرب بها sizeof( char ) ضروري:

char* buffer = malloc( N * sizeof( char ) );

أو هل يمكنني الاعتماد على sizeof( char ) دائمًا 1 وتخطي الضرب فقط

char* buffer = malloc( N );

أنا أفهم ذلك تماما sizeof يتم تقييمه أثناء الترجمة ومن ثم قد يقوم المترجم بتجميع الضرب وبالتالي ستكون عقوبة الأداء ضئيلة وعلى الأرجح صفر.

أنا أسأل بشكل أساسي عن وضوح الكود وإمكانية النقل.هل هذا الضرب من أي وقت مضى ضروري ل char يكتب؟

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

المحلول

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

نصائح أخرى

وبحكم التعريف، sizeof (شار) هو دائما يساوي 1. واحد بايت هو حجم حرف في C، بغض النظر عن عدد البتات في البايت هناك (8 على وحدة المعالجة المركزية سطح المكتب الشائعة).

والمثال النموذجي حيث بايت واحد ليس 8 بت هو PDP-10 و ، أبنية قديمة أخرى مصغرة الكمبيوتر مثل مع بايت 9/36 بت. ولكن بايت التي لا 2 ^ N أصبحت شائعة للغاية وأعتقد

وأيضا، وأنا أعتقد أن هذا هو أفضل أسلوب:

char* buf1;
double* buf2;

buf1 = malloc(sizeof(*buf1) * N);
buf2 = malloc(sizeof(*buf2) * N);

ولأنه يعمل مهما كان نوع المؤشر.

وsizeof(char) دائما 1 بغض النظر عن نوع من التلاعب الذاكرة لديك.

ومع ذلك، قد تختلف تبعا sizeof(TCHAR) خيارات المترجم الخاص بك.

وأرى أنه نوع من نموذج مضاد . هذا يدل على أن مبرمج لم يكن يعرف تماما ما هو / كانت تفعله، الأمر الذي يلقي بظلال على الفور ما تبقى من التعليمات البرمجية في ضوء مشكوك فيها.

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

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

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

char a;
printf("A char's size is %u\n", (unsigned int) sizeof a);

وهذا سوف طباعة 1، دائما، على كافة تطبيقات C مطابقة.

وأنا أيضا أتفق بشدة مع ديفيد Cournapeau والنظر في تكرار نوع <م> الاسم في malloc() نداء إلى <م> أيضا أن يكون نوع من نموذج مضاد.

وبدلا من

char *str;

str = malloc(N * sizeof (char));

وأن العديد سيكتب تخصيص مخزن مؤقت سلسلة N-حرف القدرات، وكنت أذهب مع

char *str;

str = malloc(N * sizeof *str);

وأو (سلاسل فقط) حذفت sizeof حسب أعلاه، ولكن هذا بالطبع هو أعم وتعمل فقط كذلك لأي نوع من المؤشر.

ليست ضرورية.يرى هنا (على سبيل المثال).

sizeof(char) يتم تعريفه بواسطة معيار C ليكون دائمًا 1 (بايت).لاحظ أنه بسبب sizeof إرجاع عدد من بايت عدد البتات لكل بايت غير ذي صلة (ومن الناحية العملية هو 8 على أي حال).

وشيء آخر أن نأخذ في الاعتبار هو أن المترجم يعرف بشكل ثابت قيمة sizeof (شار) هو 1 ويعرف أيضا أن بضرب عدد من ساكنة 1 يعني لا يحتاج إلى أن يتم الضرب. فإن المترجم الأمثل من ذلك. المخاوف من الأداء لا ينبغي أن تدخل في النظر على هذه الأسس.

من "معيار C الجديد.تعليق اقتصادي وثقافي”.

  1. إحصائيات:2.0% من الحجم مأخوذة من char و 1.5٪ - من unsigned char.الصفحة 1033 في نسخة 1.2 من الكتاب.
  2. الصفحة 1037.

عدد البتات في تمثيل نوع الحرف غير ذي صلة.بحكم التعريف عدد البايتات في البايت نوع الحرف هو واحد.

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

واستخدام sizeof (شار) يجعل التعليمات البرمجية أكثر قابلية للقراءة والمحمولة.

في x86 و نحن نعلم جميعا أن الحرف هو 1 بايت. لكن صراحة كتابته يساعد على جعل نوايا أكثر وضوحا، وهو شيء جيد دائما.

وأيضا، ما إذا كان يحصل على وضع الشفرة على بعض منصة أخرى حيث الحرف غير 1 بايت. ماذا لو كان شخصية فقط 4 بت بدلا من ذلك؟

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

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