3

こんにちは、バイトをパディングせずに構造体のサイズを計算する関数を作成したいと思います。

例 :

struct test{
    int   x;
    char  y;
    int   z;
};

上記の構造体のサイズを計算する場合、9バイトを取得する必要があります(つまり、パディングバイトなし)

そして、構造体に存在する変数がわからない場合を考えてみましょう。

例 :

struct test{
    int   x;
    ....
    ....
    ....
    int   z;
};

したがって、サイズを計算すると、正しいサイズが得られるはずです。

そのような関数を書くことは可能ですか?私は構造を読んでみましたが、解決策を見つけることができません.私が得ることができるいくつかのコンパイラオプションが存在するのを見ましたが、ビルドコンパイラオプションには何もしたくありません.

4

2 に答える 2

4

いいえ、C にはこれを可能にする十分なイントロスペクションがありません。実行時に、プログラムがどのフィールドが構造体にあるか、またはそれらの型が何であるかを「知る」ために使用できる情報は残っていません。

于 2013-02-04T16:43:50.470 に答える
3

sizeofコンパイラの構造は、「コンパイラが見ている」オブジェクトのサイズを提供する必要があります。ほとんどのコンパイラは、スペースを犠牲にして効率的なメモリ アクセスを行うために、構造体を 4 バイト境界に揃えます。試す

#include <stdio.h>
int main() {
  struct test{
    int x;
    char a;
    int y;
  };
  struct test myStruct;
  printf("size of myStruct is %ld\n", sizeof(myStruct));
}

私がそれを実行すると、私は得る

size of myStruct is 12

これは、私のコンパイラがこの状況で 4 バイトを「a」に割り当てていることを示しています。それがあなたの答えだと思います...私があなたの質問、特にあなたの「パディングバイトなし」のコメントを本当に誤解していない限り。

structasの定義を書き換えます。

  struct test{
    int x;
    char a;
    int y;
  }__attribute__((packed));

出力は次のようになります

size of myStruct is 9

これはコンパイル時にのみ機能するため、実際には「関数」ではありません。また、コンパイル時に構造体がわからない場合は適用されません。そのため、私の答えと上記の @unwind によって与えられたものは矛盾していないと思います。

于 2013-02-04T16:44:46.943 に答える