1. 程式人生 > >結構體聲明當中 __attribute__ ((__packed__))關鍵字

結構體聲明當中 __attribute__ ((__packed__))關鍵字

稍微瞭解過C/C++的人,都會了解它們在建立一個結構體的時候,會進行位元組對齊操作,所以往往比世界變數佔用的位元組數要多出一些,而如何減少記憶體佔用,計算記憶體使用量,也是很多面試題裡經常出現的題目。(位元組對齊的詳細內容請自行尋找資料,不要依靠本篇文章中的現象跟結果來理解位元組對齊)

但是稍微當我們真的不想要位元組對齊的時候,有沒有辦法取消位元組對齊?答案是可以,就是在結構體聲明當中,加上__attribute__ ((__packed__))關鍵字,它可以做到讓我們的結構體,按照緊湊排列的方式,佔用記憶體。來段實際程式碼:

#include <stdio.h>
#include <iostream>

using namespace std;

struct test1 {
    char c;
    int i;
};

struct __attribute__ ((__packed__)) test2 {
    char c;
    int i;
};

int main()
{
    cout << "size of test1:" << sizeof(struct test1) << endl;
    cout << "size of test2:" << sizeof(struct test2) << endl;
}
執行結果:
size of test1:8
size of test2:5
顯而易見,test1結構體裡面沒有加關鍵字,它採用了4位元組對齊的方式,即使是一個char變數,也佔用了4位元組記憶體,int佔用4位元組,共佔用了8位元組記憶體,這在64位機器當中將會更大。

而test2結構體,再加上關鍵字之後,結構體內的變數採用記憶體緊湊的方式排列,char型別佔用1位元組,int佔用4位元組,總共佔用了5個位元組的記憶體。

這些功能,在你動態的去更改結構體大小,並通過記憶體來直接訪問內部變數時非常好用,就比如redis的sds型別,都是加上了__attribute__ ((__packed__))關鍵字,來達到這些功能,詳細的可以自行閱讀redis原始碼或者觀看另一篇部落格~