سؤال

لدي عدة متطابقة سلسلة الثوابت في البرنامج:

const char* Ok()
{
  return "Ok";  
}

int main()
{
  const char* ok = "Ok";
}

هل هناك ضمان أن تكون لها نفس العنوان ، أييمكن أن أكتب التالية رمز ؟ سمعت أن GNU C++ تحسين سلاسل بحيث يكون نفس العنوان هل يمكنني استخدام هذه الميزة في البرامج ؟

int main()
{
  const char* ok = "Ok";
  if ( ok == Ok() ) // is it ok?
  ;
}
هل كانت مفيدة؟

المحلول

وهناك بالتأكيد لا يضمن، وإنما هو شائع (على ما أظن) الأمثل.

ومعيار وC ++ يقول (2.13.4 / 2 "سلسلة حرفية):

<اقتباس فقرة>   

وإذا كان كل سلسلة حرفية متميزة (وهذا هو، يتم تخزينها في كائنات غير متداخلة) هو تطبيق المعرفة.

لتكون واضحة، يجب أن لا كتابة التعليمات البرمجية التي يفترض أن هذا التحسين تجري - كما يقول كريس لوتز الرمز، C ++ التي تعتمد على هذا الرمز الذي ينتظر أن تكون مكسورة

نصائح أخرى

وهذا ما يسمى سلسلة interning

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

دول مجلس التعاون الخليجي يستخدم هذا التحسين ، و مايكروسوفت لا (يسمونه سلسلة تجميع).انها مجرد الأمثل, C++ القياسية صراحة أنه لا يمكنك استخدام هذا (في 2.13.4/2).وبالإضافة إلى ذلك, فقط تخيل أن عليك الحصول على مؤشر إلى سلسلة من وحدة/مكتبة - لا أعتقد أن المترجم يمكن أن تجعل مثل هذه الأمثل في هذه الحالة.

<اقتباس فقرة>   

هل هناك ضمان أن تكون لها نفس العنوان، أي يمكن لي كتابة التعليمات البرمجية التالية؟

والمعيار يسمح هذه التحسينات منذ قراءة فقط سلسلة حرفية.

<اقتباس فقرة>   

وسمعت أن GNU C ++ تحسين سلاسل بحيث يصبح لديهم نفس العنوان، يمكن لي استخدام هذه الميزة في برامج بلدي؟

نعم، دول مجلس التعاون الخليجي / G ++ غالبا ما يفعل ذلك. AFAIK، هناك خيار لتحويل هذا على / قبالة.

وليس هناك مثل هذا الضمان. اللغة يقول مجرد أنهم <م> قد لها نفس العنوان. أو لم تكن قد.

في الواقع، هناك حل، والحل بسيط جدا:

char const * const Message_Ok = "OK";

char const * const OK() { return Message_Ok; }

int main(int argc, const char* argv[])
{
  if (OK() == Message_Ok) { std::cout << "OK" << std::endl; }
  return 0;
}

وأنت لا يمكن المقارنة بين سلسلة حرفية مختلفة، ولكن استخدام متغير عمومي CONST أن ينقل المعنى الخاص وانها OK ذلك لمقارنة عنوان الذاكرة:)

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

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