1. 程式人生 > >struct和class內存大小的計算

struct和class內存大小的計算

有關 就是 大小 2個 ostream short out () 偏移

結構體內存大小的計算:

用例一:

#include<stdio.h>
union ss
{
	int a;
	char b;
};
struct MyStruct
{
	int temp1;//4個字節
	char  temp2;//一個字節,補齊3個字節
	ss aa;//4個字節
	char temp3;//一個字節
	char temp4;//一個字節,補齊兩個字節
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  輸出 16

解析:對齊規則是按照成員的聲明順序,依次安排內存,對齊字節數為最大成員變量的字節大小,偏移量為最大成員變量的字節數的整數倍,在這個程序中對齊字節數為4,計算步驟如下:

首先是temp1 四個字節,temp2 一個字節,還剩3個字節,因為後面是aa 4個字節,可以自己對齊,所以temp2需要補齊3個字節, temp3 一個字節,temp4一個字節,對齊是4個字節,還剩2個字節需要補齊。所以總共是16個字節。

#include<stdio.h>
union ss
{
	int a;
	double b;
};
struct MyStruct
{
	int temp1;//4個字節
	char  temp2;//1個字節,對齊是8個字節,還需3個字節補齊
	ss aa;//8個字節
	char temp3;//1個字節
	short temp4;//2個字節,補齊還需要5個字節
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  輸出結果為 24

#include<stdio.h>
union ss
{
	int a;
	double b;
};

struct student
{
	int name;
	char sex;
	double num;

};
struct MyStruct
{
	int temp1;//4個字節
	char  temp2;//1一個字節,補齊3個字節
	ss aa;//8個字節
	char temp3;//一個字節
	short temp4;//2個字節,補齊5個字節
	student people;//16個字節
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  結果為 40

解析:此時需要註意的是,對齊字節數8個字節,而不是16個字節。student people 對象內部先進行一次對齊,然後如果如果是外面對齊字節數的整數倍就不需要

再進行對齊了,如果不是就需要再次進行對齊。

下面的是需要二次對齊的程序:

#include<stdio.h>
struct MyStruct
{
	char temp1;
	char temp2;
};
struct student
{
	int name;//4個字節
	char sex;//1個字節
	MyStruct aa;//2個字節
	char temp;//1個字節

};
int main()
{
	printf("%d", sizeof(student));

}

  輸出為 8

#include<stdio.h>
union ss
{
	int a;
	double b;
};

struct student
{
	//int name;
	//char sex;
	int num;

};
struct MyStruct
{
	int temp1;//4個字節
	char  temp2;//1一個字節,補齊3個字節
	ss aa;//8個字節
	char temp3;//1個字節
	short temp4;//2個字節
	student people;//4個字節,補齊一個字節
};
int main()
{
	printf("%d", sizeof(MyStruct));
	return 0;
}

  輸出結果為:24

總結,在一個結構體中有另一個結構體的對象時,對齊字節數與這個結構體對象的字節數無關,只與結構體中的成員變量和union 有關。

類的內存大小的計算:

#include<iostream>
using namespace std;
class student
{
public:
	student() 
	{
		cout << "構造函數" << endl;
	}
	//void fun();
};
int main()
{
	cout << sizeof(student) << endl;
	return 0;
}

  運行結果: 1

解析:如果是空類也會輸出1。如果一個類只含有成員函數沒有成員變量或者虛函數,類的大小都是1。如果含有靜態成員變量或者是靜態成員函數,也會是1,因為靜態成員變量和靜態成員函數是類的所有對象共享的,它並不存放在一個實例化對象中

為什麽空類也會是1呢?

所謂類的實例化就是在內存中分配一塊地址,每一個實例在內存中都有獨一無二的地址,而了到達這個效果,編譯器往往會給一個空類隱含的增加一個字節,這樣實例化出來的每一個空類的對象都會得到一個獨一無二的地址。如果空類的大小是0的話,那麽實例化出來的所有空類對象都是在同樣一個內存地址上,就相當於同一個對象,這不是我們想要的。

struct和class內存大小的計算