結構體聲明當中 __attribute__ ((__packed__))關鍵字
阿新 • • 發佈:2019-01-09
稍微瞭解過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原始碼或者觀看另一篇部落格~