انواع Data Type Modifier در زبان C++
در زبان برنامه نویسی C++، می توان با استفاده از Data Type Modifier های موجود نوع متغیر را تغییر داد. یک Data Type Modifier برای تغییر مفهوم نوع پایه یک متغیر استفاده می شود.
در زیر لیست انواع Data Type Modifier در زبان C++ را مشاهده می کنید:
- signed
- unsigned
- long
- short
Modifier های singed، unsigned، long و short را می توان بر روی انواع داده مبتنی بر integer اعمال کرد. علاوه بر این می توان modifier های singed و unsigned را بروی نوع char و long را بر روی نوع double اعمال کرد. Modifier های singed و unsigned همچنین می توانند به عنوان پیشوندی برای Modifier های long و short باشند. در زبان C++ می توانید در هنگام استفاده از Modifier های unsigned، short و یا long کلمه کلیدی int را ننویسید.
به عنوان مثال هر دو متغیر زیر به صورت عدد صحیح بدون علامت می باشند:
1 2 | unsigned x; unsigned int y; |
برای درک بهتر عملکرد Modifier های singed و unsigned به مثال زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <iostream> using namespace std; /* This program shows the difference between * signed and unsigned integers. */ int main() { short int i; // a signed short integer short unsigned int j; // an unsigned short integer j = 50000; i = j; cout << i << " " << j; return 0; } |
بعد از اینکه کد بالا توسط کامپایلر زبان C++ اجرا شود نتیجه زیر بدست خواهد آمد:
1 | -15536 50000 |
در کد بالا به دلیل الگوری بیتی 50000 که به عنوان unsigned short می باشد، به صورت -15,536 تقسیر می شود.
Type Qualifier ها در C++
type qualifier ها اطلاعات اضافی در مورد متغیر را فراهم می کنند. در جدول زیر type qualifier های موجود در زبان C++ را مشاهده می کنید.
ردیف | Qualifier |
1 | const متغیرها و شیء هایی که به صورت const تعریف شوند، در حین اجرای برنامه نمی توانند تغییر کنند. |
2 | volatile volatile به کامپایلر می گوید که مقدار متغیر ممکن است در متد هایی که صریحا توسط برنامه مشخص نشده است، تغییر کند و از بهینه سازی کد توسط کامپایلر جلو گیری می کند (فقط آن بخشی از کد که به صورت volatile باشد، بهینه نمی شود). |
3 | restrict عبارت restrict به کامپایلر می گوید که از بارگذاری مجدد یک متغیر جلوگیری کند و برای بهینه سازی کد از مقدار قبلی که بارگذرای شده است، استفاده کند. |
مثال const
1 2 3 4 5 6 7 8 9 10 | #include <iostream> using namespace std; int main() { const int myInt = 10; myInt = 15; // generate error => assignment of read-only variable 'myInt' myInt += 5; // generate error => assignment of read-only variable 'myInt' myInt -= 5; // generate error => assignment of read-only variable 'myInt' cout<<myInt<<endl; return 0; } |
مثال volatile
مثال زیر توسط کامپایلر بهینه سازی می شود:
1 2 3 4 5 6 7 8 9 10 | /* Compile code with optimization option */ #include <stdio.h> int main(void){ const int local = 10; int *ptr = (int*) &local; printf("Initial value of local : %d n", local); *ptr = 100; printf("Modified value of local: %d n", local); return 0; } |
خروجی (به زمان کامپایل توجه کنید):
1 2 3 4 5 6 | [narendra@ubuntu]$ gcc -O3 volatile.c -o volatile –save-temps [narendra@ubuntu]$ ./volatile Initial value of local : 10 Modified value of local: 10 [narendra@ubuntu]$ ls -l volatile.s -rw-r–r– 1 narendra narendra 626 2016-11-19 16:21 volatile.s |
مثال زیر توسط کامپایلر بهینه سازی نمی شود:
1 2 3 4 5 6 7 8 9 10 | /* Compile code with optimization option */ #include <stdio.h> int main(void){ const volatile int local = 10; int *ptr = (int*) &local; printf("Initial value of local : %d n", local); *ptr = 100; printf("Modified value of local: %d n", local); return 0; } |
خروجی (به زمان کامپایل توجه کنید):
1 2 3 4 5 6 7 | [narendra@ubuntu]$ gcc -O3 volatile.c -o volatile –save-temp [narendra@ubuntu]$ ./volatile Initial value of local : 10 Modified value of local: 100 [narendra@ubuntu]$ ls -l volatile.s -rw-r–r– 1 narendra narendra 711 2016-11-19 16:22 volatile.s [narendra@ubuntu]$ |
مثال restrict
در مثال زیر از restrict استفاده نشده است:
1 2 3 4 | void f(int *a, int *b, int *x) { *a += *x; *b += *x; } |
مونتاژ اسمبلی کد بالا:
1 2 3 4 5 6 7 8 9 10 | load R1 ← *x ; Load the value of x pointer load R2 ← *a ; Load the value of a pointer add R2 += R1 ; Perform Addition set R2 → *a ; Update the value of a pointer ; Similarly for b, note that x is loaded twice, ; because a may be equal to x. load R1 ← *x load R2 ← *b add R2 += R1 set R2 → *b |
در مثال زیر از restrict استفاده شده است:
1 2 3 4 5 6 7 8 9 10 11 12 | void fr(int *restrict a, int *restrict b, int *restrict x); مونتاژ اسمبلی کد بالا: load R1 ← *x load R2 ← *a add R2 += R1 set R2 → *a ; Note that x is not reloaded, ; because the compiler knows it is unchanged ; load R1 ← *x load R2 ← *b add R2 += R1 set R2 → *b |
هیچ نظری ثبت نشده است