天天看點

C++ sizeof() 函數和strlen()函數總結

C/C++ sizeof() 函數和strlen()函數總結

sizef()函數的問題:本質上主要是各種對象在記憶體空間中的配置設定問題,拷貝一下程式,在自己的電腦上跑一下就能了解了!

sizeof()和strlen()之間的差別要清楚:sizeof()是運算符,傳回的是size_t類型,strlen()是函數

#include<iostream>  
#include<string>
#include<vector>
using namespace std;

int main(int argc, char**argv)  
{
	/*sizeof():傳回一個對象或者類型所占的記憶體位元組數,傳回值為size_t*/
	/*形式:1) sizeof( object ); // sizeof( 對象 );               */
	/*      2) sizeof( type_name ); // sizeof( 類型 );            */
	/*      3) sizeof object; // sizeof 對象;                     */

	//char、signed char和unsigned char任何情況下皆為1
	cout<<"char:"<<sizeof(char)<<endl;
	cout<<"signed char:"<<sizeof(signed char)<<endl;
	cout<<"unsigned char:"<<sizeof(unsigned char)<<endl;

	//基本資料類型指short、int、long、float、double這樣的簡單内置資料類型依賴于機器
	cout<<"short:"<<sizeof(short)<<endl;
	cout<<"int:"<<sizeof(int)<<endl;
	cout<<"long:"<<sizeof(long)<<endl;
	cout<<"float:"<<sizeof(float)<<endl;
	cout<<"double:"<<sizeof(double)<<endl;

	//指針變量的sizeof為計算機内部位址總線的寬度(指針本身所占空間的大小),32位機器為4
	char *pi = "sad" ;//字元串字面值常量
	cout<<"指針pi:"<<sizeof(pi)<<endl;
	cout<<"指針pi所指向的内容的大小:"<<sizeof(*pi)<<endl;

	//數組的sizeof值等于數組所占用的記憶體位元組數
	int a[20];
	cout<<"單個數組元素a[20]:"<<sizeof(a[20])<<endl;
	cout<<"整個數組int a[20]:"<<sizeof(a)<<endl;

	//vector和string的sizeof值傳回的是該類型固定部分的大小,不會計算所占空間
	//字元串所占的空間是從堆中動态配置設定的,字元串的内容是指針在程式中動态在堆中進行維護的
	//string和string執行個體的傳回值永遠是一樣的,他測試的不是string内部包含多少字元串之類的資訊
	//string本質是一個類。對着2個進行sizeof得到的是類中資料成員的大小。
	//這2家夥中資料成員有5個 _Bx,_Myres,_Mysize,_Alval,_Myfirstiter 一共32位元組
	vector<int> vec1(20);
	string b = "1234";
	cout<<"vector<int> vec1(20):"<<sizeof(vec1)<<endl;
	cout<<"string b :"<<sizeof(b)<<endl;
	cout<<"string:"<<sizeof(string)<<endl;

	//結構體的sizeof,需要考慮位元組對齊的問題
	//結構體的大小等于最後一個成員的偏移量加上其大小再加上末尾的填充位元組數目,即:
	//sizeof( struct ) = offsetof( last item ) + sizeof( last item ) + sizeof( trailing padding )
	//存儲單元的實際位址與其所在段的段位址之間的距離稱為段内偏移:偏移量
	//1) 結構體變量的首位址能夠被其最寬基本類型成員的大小所整除;
	//2) 結構體每個成員相對于結構體首位址的偏移量(offset)都是成員大小的整數倍,
	//	如有需要編譯器會在成員之間加上填充位元組(internal adding);
	//3) 結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最
	//	末一個成員之後加上填充位元組(trailing padding)。
	//結構體内的結構體,打散開來看
	struct S1
	{
		char c;//1
		int i;//4
	};
	S1 s1;//執行個體對象
	struct S2
	{
		char c1;//1
		S1 s;//看作整體,8
		char c2;//1
	};
	cout<<"結構體S1 :"<<sizeof(S1)<<endl;
	cout<<"結構體s1 :"<<sizeof(s1)<<endl;
	cout<<"結構體S2 :"<<sizeof(S2)<<endl;

	//聯合體的sizeof:結構體在記憶體組織上是順序式的,聯合體則是重疊式,各成員共享一段記憶體,是以整個
	//聯合體的sizeof也就是每個成員sizeof的最大值。結構體的成員也可以是複合類型,這裡,複合類型成員
	//是被作為整體考慮的: U的sizeof值等于sizeof(s)
	union U
	{
		int i;
		char c;
		S1 s;//8
	};
	cout<<"聯合體U :"<<sizeof(U)<<endl;

	//sizeof()和strlen()對于C字元串數組的辨析
	//sizeof()需要加上字元串之後的"\0",算一個字元
	//strlen()遇到"\0"截至
	//sizeof是算符,strlen是函數
	char m[] = "123\0pds";//再試試123\0456,嘿嘿,答案又變了
	char *n = "123\0rew";
	cout<<"sizeof :"<<sizeof(m)<<endl;
	cout<<"strlen :"<<strlen(n)<<endl;

	return 0;
}           

繼續閱讀