قد تحدث المشكلات إذا لم نستخدم مؤهلًا متغيرًا يتضمن ، عند تمكين التحسين ، قد لا تعمل الشفرة بالشكل المتوقع. عند استخدام المقاطعات وتمكينها ، لا يمكن أن يعمل الرمز كما هو مخطط له. يتم الاحتفاظ بالبيانات فقط في التخزين المتغير أثناء تشغيل الطاقة. عند إزالة العرض ، يحدث فقدان البيانات.
ومع ذلك ، فإن التخزين غير المتطاير يحتفظ بالبيانات حتى في حالة انقطاع التيار الكهربائي. يتم تخزين معلومات العملية لفترة وجيزة على التخزين المتطاير لأنها أسرع بكثير من التخزين غير المتطاير. على عكس التخزين غير المتطاير ، يعد التخزين المتطاير أكثر ملاءمة لحماية البيانات الحساسة. هذا بسبب عدم إمكانية الوصول إلى البيانات عند إيقاف تشغيل مصدر الطاقة. يتكلف التخزين المتطاير الكثير لأن أنظمة الكمبيوتر لا يمكنها استيعاب سوى عدد قليل من الميغابايت إلى بضع غيغابايت '.
خصائص المؤهل المتغير في C ++
سيتم عرض الوسائل المتغيرة C ++ هنا. عندما نعلن عن متغير ، يتم تطبيق المؤهل 'متغير'. إنه بمثابة تذكير للمجمع بأن القيمة عرضة للتغيير في أي وقت. تمتلك المتقلبة بعض السمات المذكورة أدناه.
• لا يمكن تغيير تخصيص الذاكرة بالكلمة الأساسية المتغيرة.
• لا يمكن تخزين متغيرات السجل مؤقتًا.
• من حيث التخصيص ، لا يمكن تغيير القيمة.
استخدام المؤهل المتغير في C ++
1. على الرغم من أن التعليمات البرمجية الخاصة بك لا تعدل قيمة المتغير ، إلا أنها قد تفعل ذلك. نتيجة لذلك ، في كل مرة يتحقق فيها المترجم من حالة المتغير ، لا يمكنه افتراض أنه هو نفس أحدث قيمة تمت قراءتها منه أو أحدث قيمة مخزنة ؛ بل يجب أن تكتسب قيمة المتغير مرة أخرى.
2. لا يُطلب من المترجم إلغاء فعل تخزين القيمة لأنه 'أثر جانبي' يمكن رؤيته من الخارج ويحدث عندما يتم حفظ قيمة في متغير متغير. على سبيل المثال ، إذا تم وضع قيمتين في صف واحد ، فيجب على المترجم وضع القيمة مرتين.
بناء جملة المؤهل المتغير في C ++
# نوع البيانات المتغير اسم_المتغيريجب استخدام الكلمة الأساسية المتغيرة في الإعلان ، ويشير نوع البيانات إلى أي نوع بيانات ، بما في ذلك مزدوج أو عائم أو عدد صحيح. أخيرًا ، نختار اسمًا للمتغير. يمكننا تحديد متغير متغير باستخدام أي من الطريقتين لأن كلا الإعلانين صالحين.
مثال: يتم استخدام المؤهل المتغير لتحديد الكائنات التي يمكن تعديلها بواسطة خيوط أخرى أو إجراءات خارجية في C ++
إذا تم تغيير الكائن بواسطة إشارة خارجية أو إجراء يعمل كمقاطعة ، فيجب استرداد القيمة المعدلة من ذاكرة الوصول العشوائي لأن الحالة المخزنة مؤقتًا لم تعد مناسبة في هذه الأثناء. نتيجة لذلك ، يتعامل المترجم مع الوصول إلى الكائنات المتطايرة بشكل مناسب.
# تضمين# تضمين
# تضمين <الخيط>
باستخدام الأمراض المنقولة جنسيا :: كوت ؛
باستخدام الأمراض المنقولة جنسيا :: endl ؛
باستخدام الأمراض المنقولة جنسيا :: سير ؛
باستخدام الأمراض المنقولة جنسيا :: يتناول الطعام ؛
متطايره int ثواني = 0 ؛
فارغ تأخير خمس ثوان ( ) {
في حين ( ثواني < 3 ) {
انت نائم ( 200000 ) ؛
سير << 'انتظار...' << endl ؛
}
}
فارغ زيادةالثواني ( ) {
إلى عن على ( int أنا = 0 ؛ أنا < 5 ؛ ++ أنا ) {
ينام ( 1 ) ؛
سير << 'زيادة' << endl ؛
ثواني = ثواني + 1 ؛
}
}
int رئيسي ( ) {
هيكل بداية زمنية { } ؛
هيكل نهاية الزمن { } ؛
الأمراض المنقولة جنسيا :: مسلك موضوع 1 ؛
موضوع 1 = الأمراض المنقولة جنسيا :: مسلك ( زيادةالثواني ) ؛
تأخير خمس ثوان ( ) ؛
موضوع 1. انضم ( ) ؛
إرجاع EXIT_SUCCESS ؛
}
لتوضيح السيناريو المحتمل ، استخدمنا الكلمة الأساسية المتغيرة التي تم الإعلان عن المتغير كثواني من نوع البيانات 'int' وقمنا بتعيين قيمة 0 له. بعد ذلك ، نقوم ببناء وظيفتين: إحداهما 'DelayFiveSeconds' التي تغير متغير العدد الصحيح المتغير العام ، والأخرى باسم 'IncrementSeconds' التي تؤدي نفس التقييم داخل حلقة while. تجدر الإشارة إلى أن هذا المثال يسمح بتكرار حلقة while خلال الثواني التي يجب أن تكون فيها الثواني أقل من 3.
عند استيفاء الشرط ، سيتم تنفيذ الكتلة while. داخل الكتلة while ، استدعينا التابع unsleep الذي يطبع العبارة 'waiting'. وظيفة 'IncrementSceonds' لها حلقة for. بعد التكرار ، يتم استدعاء عملية السكون ، والتي تطبع العبارة 'زيادة' وتزيد من متغير 'الثواني'. يتم التنفيذ الأولي لوظيفة 'IncrementSeconds' بواسطة سلسلة منفصلة تم إنشاؤها بواسطة الوظيفة الرئيسية. ثم يتم استدعاء طريقة 'DelayFiveSeconds' من خلال مؤشر الترابط الرئيسي ، وإدخال حلقة لا تنتهي إذا لم يتحرك متغير الثواني أعلى من القيمة 5.
بمجرد أن يلاحظ الخيط الرئيسي أن قيمة متغير الثواني قد تغيرت ، فإنه سيعود من الطريقة لأن مؤشر ترابط آخر قد بدأ بالفعل في زيادته بشكل متزامن.
لتشغيل كود الخيط في C ++ ، يجب أن نستخدم الأمر 'g ++ -pthread –o filename filename.cc'. إذا لم تقم بنشر '-pthread' في الأمر ، فهناك احتمال أن يتم طرح استثناء من قبل المترجم. نتيجة لذلك ، قمنا بعمل وظيفة انتظار مشروطة تنتظر حتى يتم تغيير الكائن المتطاير بواسطة قوة خارجية. من المهم أن تضع في اعتبارك أن كتلة رمز التحديث يمكن أن تأتي من قسم ترجمة مختلف أو إجراء إشارة خارجية ، على الرغم من أن هذا الرمز سيظل يعمل بنفس الطريقة إذا تمت إزالة المؤهل المتغير واستخدام متغير عالمي تقليدي.
استنتاج
هنا ، نراجع نظرة عامة على Volatile في C ++ جنبًا إلى جنب مع بناء الجملة والاستخدام والأمثلة المناسبة لفهم أفضل. نظرًا لأن المترجم لا يمكنه التنبؤ بالقيمة ، فإن التقلبات أمر بالغ الأهمية في برمجة لغة سي. الفائدة الأساسية لاستخدام متغير هو أن قيمته قد تختلف كلما طلب المستخدم تعديلها أو عندما يكون هناك مؤشر ترابط آخر يستخدم نفس المتغير نشطًا.