2

#pragma ディレクティブを使用して整列するコードを記述しましたが、整列がどのように発生するのか理解できませんでした。ubuntuでgccを使用しています。

#include<stdio.h>

#define MALE 0;
#define FEMALE 1;
#define SINGLE 0;
#define MARRIED 1;
#pragma pack(3);

int main()
{
    struct emp
    {
        unsigned gender :1;
        unsigned mar:1;
        unsigned hobby:1;
        unsigned scheme :1;
    };
    struct emp e;
    e.gender=MALE;
    e.mar=SINGLE;
    e.hobby=1;
    e.scheme=1;
    printf("size of %d",sizeof(e));
    return 0;
}

#pragma pack as 1 を使うと size が 1 になり、#pragma pack as 2 を使うと size が 2 になり、3 なら size が 4 になります。

何が起こっているのか教えていただけますか?使わなくても4つ来ます。

#pragma pack(1)では、との違いは何#pragma pack(2)ですか?

4

3 に答える 3

3

3#pragma packディレクティブの有効な引数ではありません。

たとえば、このページによると、有効な値は1248およびです。16

于 2012-07-29T15:11:41.183 に答える
0

`#pragma'ディレクティブは、言語自体で伝達される情報以外に、コンパイラに追加情報を提供するためにC標準で指定されているメソッドです。

#pragmapackは、構造体、共用体、およびクラスのメンバーのパッキングの配置を指定します。

有効な値は1、2、4、8、および16です。メンバーの配置は、上記の値のいずれかの倍数またはメンバーのサイズの倍数のいずれか小さい方の境界になります。

詳細については、MSDNページ およびここを参照してください。

また、ここから以下の構造パッキングに関するいくつかの情報

構造パッキングとは何ですか?

構造体のメンバー間でパディングされたバイトを避けることが必須の場合があります。たとえば、ELFファイルヘッダーまたはBMPまたはJPEGファイルヘッダーの内容を読み取ります。ヘッダーレイアウトと同様の構造を定義してマッピングする必要があります。ただし、そのようなメンバーへのアクセスには注意が必要です。通常、バイトごとに読み取ることは、ずれた例外を回避するためのオプションです。パフォーマンスに打撃があります。

ほとんどのコンパイラは、プラグマやコマンドラインスイッチなどのデフォルトのパディングをオフにするための非標準の拡張機能を提供します。詳細については、それぞれのコンパイラのドキュメントを参照してください。

i want to know that when i write #pragma pack(1) it set first bits and atart second from next one what if i write #pragma(2) , whats the difference 

これに答えるために、#pragmaを2に設定すると、構造体に存在するデータが2バイト未満の場合、その配置は同じままになります。ただし、2バイトを超える場合(たとえば4バイトの整数)、2バイトの境界で分割および整列されます。

于 2012-07-29T15:29:35.847 に答える
0

#pragma pack(1)との違い#pragma pack(2)は、最初のケースでは、構造体は任意のアドレスで開始できると言うことです。

あなた #pragma pack(2)が言うには、開始アドレスは 2 で割り切れる (偶数アドレス) 必要があります。コンパイラは、構造体のサイズが 2 であると宣言することによってこれを行います (未使用のスペースでパディングします)。

empのようなの配列を作成する場合、 は配列のemp a[10]sizeof(emp)要素間の距離でもあります。そのため、コンパイラはサイズを値の次の倍数に丸め#pragma packます。

于 2012-07-29T15:58:53.163 に答える