سلام
سوال شما خیلی کلی هست و مطالب زیادی را در بر می گیره مثل اینکه بپرسید سی پلاس پلاس را برای من توضیح بدید اما اجمالا:
در C++11 یک سری تغییرات در این لیستی که ارائه دادید انجام شده
مشخص کننده های کلاس حافظه عبارتند از
register
static
thread_local
extern
mutable
به غیر از mutable کار اینها تعیین دو خصوصیت مدت حافظه duration و پیوند linkage هنگام اعلان یک نام می باشد
مدت حافظه یک چیز حداقل طول عمر بالقوه حافظه مربوط به اون چیز هست که چهار دسته میشه:
static : با شروع برنامه حافظه به متغیر اختصاص داده میشه و در انتهای برنامه آزاد میشه
thread: با شروع thread حافظه به متغیر اختصاص داده میشه و در انتهای thread آزاد میشه
automatic: متغیر تعریف شده در یک بلاک ( مثل متغیرهایی که در یک تابع تعریف می کنیم) البته بدون استفاده از کلمات staticو extern و thread_local
dynamic: که با استفاده از عملگر new فضا به اون اختصاص داده میشه
برای اینکه بدونیم linkage یا پیوند چیه بهتره بدونیم یک برنامه از پیوند یا link چند واحد ترجمه ایجاد میشه. منظور از واحد ترجمه کدهای موجود در یک فایل سورس cpp به همراه فایلهایی که در اون include میشه هست
یک نام دارای linkage هست در صورتی که اگر اون نام در دو یا چند محدوده scope بیاد دقیقا منظورش یک چیز باشه. این چیز می تونه یک آبجکت ، رفرنس، تابع، نوع، تمپلیت، فضای نام یا یک مقدار باشه
محدوده ها هم مثل محدوده بلاک یا محدوده فضای نام و مثل اینها
یک نام دارای لینکیج خارجی external هست در صورتی که اگر اون نام در واحد های ترجمه مختلف بیاد و یا در محدوده های مختلف یک واحد ترجمه بیاد منظورش یک چیز باشه
یک نام دارای لینکیج داخلی internal هست در صورتی که اگر اون نام در محدوده های مختلف یک واحد ترجمه بیاد منظورش یک چیز باشه
یک نام لینکیج ندارد در صورتی که اگر اون نام در محدوده های مختلف بیاد منظورش یک چیز نباشه. یعنی اون نام فقط در یک محدوده معنا داره
با این مقدمه توضیح مختصر هر یک از کلاسهای حافظه میشه
register: برای مدت حافظه AUTOMATIC و نیز پیشنهاد به کامپایلر که متغیر را در رجیستر پردازنده قرار بدهد ( این کلمه در C++11 منسوخ شده)
static: برای مدت حافظه static یا thread و نیز لینکیج داخلی به کار میره
thread_local: برای مدت حافظه thread به کار میره
extern: برای مدت حافظه static یا thread و نیز لینکیج خارجی به کار میره
(البته اینها خیلی خلاصه هست مثلا در بعضی مواقع extern موجب نمیشه لینکیج یک چیز خارجی بشه)
mutable: ربطی به مدت حافظه و لینکیج نداره و جهت تغییر دادن عضو یک کلاس به کار میره در صورتی که اون کلاس const باشه (توی یک تاپیک توضیح دادم)
حالا با توجه به نیازتون میتونید از هر یک از این کلمات استفاده کنید
مطالب خیلی خلاصه گفته شد
پیشنهاد می کنم ابتدا ین منبع را مطالعه کنید:
en.cppreference.com/w/cpp/language/storage_duration
و برای مطالعه جزئیات هم به استاندارد C++11 مراجعه کنید
حداقل سوال خودتون را جزئی تر بپرسید چون خیلی مطلب هست.