構造体宣言中_attribute__ ((__packed__))キーワード


C/C++を少し知ったことがある人は、構造体を構築する際にバイトの位置合わせ操作を行うことを知っています.そのため、世界変数よりもバイト数が多くなりがちですが、メモリの使用量を減らすには、メモリの使用量を計算する方法も、多くの面接問題でよくある問題です.(バイトアラインメントの詳細は、本編の現象や結果でバイトアラインメントを理解しないで、自分で資料を探してください)
しかし、本当にバイトの位置合わせが欲しくない場合は、バイトの位置合わせをキャンセルする方法はありませんか?答えはいいです.構造体宣言に__を加えることです.attribute__ ((__packed__))キーワードは、構造体をコンパクトに並べてメモリを消費することができます.実際のコード:
#include 
#include 

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

明らかにtest 1構造体にはキーワードが付いておらず、4バイトの整列方式を採用しており、char変数でも4バイトのメモリを占有し、intは4バイトのメモリを占有し、8バイトのメモリを占有しており、64ビットマシンではさらに大きくなるだろう.
一方test 2構造体は,キーワードを加えると,構造内の変数がメモリコンパクトに配列され,charタイプが1バイト,intが4バイト,合計5バイトのメモリを占有する.
これらの機能は、構造体のサイズを動的に変更し、メモリを介して内部変数に直接アクセスするときに非常に便利です.例えば、redisのsdsタイプには、__が追加されています.attribute__ ((__packed__))キーワードは、これらの機能を達成するために、詳細は自分でredisソースを読むか、別のブログを見ることができます~