本文主要記錄了 sizeof 操作符 和 strlen() 函數的區別,以及各自的用途。(在下才疏學淺,發現錯誤,還請留言指正)
示例代碼如下:
#include<stdio.h> int main() { char str[20]="0123456789"; printf("strlen(str)==%d\n",strlen(str));//計算字符串的長度(不包括0x00),結果:10 printf("sizeof(str)==%d\n",sizeof(str));//大小不退化,結果:20 char* ss = "0123456789"; printf("strlen(ss)==%d\n",strlen(ss));//結果:10 printf("sizeof(ss)==%d\n",sizeof(ss));//計算ss指針占用內存空間的大小,結果:4 return 0; }
像這種替換是很少用到的,之所以這樣寫,僅僅方便知識點的掌握。
//題意:計算字符串的長度,並轉化大寫。 #include <iostream> #include<string> using namespace std; void upperCase(char str[]) { int test = sizeof(str);//strlen(str) int test2 =sizeof(str[0]); for(size_t i=0;i<test/test2;++i)//i<test { if( 'a' <= str[i] && str[i] <= 'z' ) str[i] -= ('a' - 'A'); } } int main() { char str[] = "aBcDe"; //從上面我們知道sizeof(數組),是不退化的,返回的結果是整個數組的大小,而不是裡面元素的個數。 //如果數組的初始化為 char str[9] = "aBcDe",那麼結果就不正確了。 cout<<"The length of str is:"<<sizeof(str)/sizeof(str[0])<<endl;//strlen(str) upperCase(str); cout << str << endl; return 0; }
示例代碼1:
#include <iostream> using namespace std; union u { double a; int b; }; union u2 { char a[13]; int b; }; union u3 { char a[13]; char b; }; int main() { cout<<"sizeof(u) == "<<sizeof(u)<<endl;//結果:8 cout<<"sizeof(u2) == "<<sizeof(u2)<<endl;//結果:16(使用了字節對齊) cout<<"sizeof(u3) == "<<sizeof(u3)<<endl;//結果:13(使用了字節對齊) return 0; }
union的大小取決於成員中占用空間最大的那個成員(考慮字節的對齊),同時,考慮字節對齊的符合數據類型有:union,class,struct
CPU對齊的問題,編譯器會盡量把數據放在它的對齊上以提高CPU的命中率。可以使用#pragma pack(x)來修改編譯器的對齊方式。
C++固有類型的對齊取編譯器對齊方式與自身大小中較小的一個。例如:編譯器以2對齊,int類型大小是4,則int的對齊是2和4中最小的2.因為默認的對齊是8(long double),所以固有類型的對齊方式就是自身。如果是符合類型,則都小於8的話,取成員類型最大的對齊。
示例代碼2:
#include <iostream> using namespace std; #pragma pack(2)//手動將對齊方式修改為2,所以int的對齊也為2了。所以結果10,如果去掉這一句,則為12 union u { char buf[9]; int a; }; int main() { cout<<"sizeof(u) == "<<sizeof(u)<<endl; return 0; }