1. 程式人生 > >C/C++中結構體記憶體分配問題

C/C++中結構體記憶體分配問題

有人問起當一個結構體裡面只有一個char型元素的時候,為什麼這個型別的變數也佔了四個位元組呢.下面我們來看一下:

對於一個結構體,裡面的元素排列順序不同,那麼分配的空間也會不同. 我們在VC6.0下看如下結構體:

struct test
{
    char    item1;
    int     item2;
    double  item3;
};當開闢一個如上結構體型別的空間的時候,系統為它準備的是16個位元組的空間;而當我們試著去改變裡面元素的順序的時候,如下:

struct test
{
    char    item1;
    double  item3;
    int     item2;
};這個結構體型別的變數所佔的空間就變成了24個位元組.

再考慮下面這個結構體:

struct test1
{
    char    item1;
    int     item2;
    double  item4;
    int     item3;
};當為這個結構體型別的變數分配空間的時候,我們得到的結果是這個變數得到了24個位元組大小的空間.

從上面三個例子,我們可以得出以下結論:

1、結構體變數所分配的空間必定是4或者8的倍數,這是一般前提。這是為了資料對齊,因為我們現在所使用的是基本i386架構的CPU(32位或64位)。而這種架構的CPU是不允許基數記憶體存取的。

2、但是如果說是4的倍數,那麼上面第二個結構體中三個元素卻佔了24個位元組的空間呢。而第三個結構有4個變數也只佔了24個位元組的空間呢。這是由裡面的資料型別所決定的。在上面第二個結構全中,第一個元素是一個char(佔一個位元組)型,第二個元素是一個double(佔8個位元組)型,第三個元素是int(佔4個位元組)型。當存取了一個char型變數後,系統發現第二個變數是一個double型,為了資料對齊,當前地址以及當前地址下一個地址所指向的空間都被迫“捨棄”(不儲存任何資料),這就佔了8個位元組,然後存取第二個變數,又佔去8個位元組;系統又發現第三個變數是一個int型,同樣,為了資料對齊,又分配了8個位元組,這樣,這個結構體型別的變數就佔去了24個位元組。對第三個結構體也可以此類。

由此,我們發現:結構體所佔空間是由其中佔空間最大的元素所決定的。

所以,在設計結構體的時候,元素排列位置的不同常常會影響程式所佔的空間以及執行效率。