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

这表明我的编译器在这种情况下为“a”分配了四个字节。我认为这就是你的答案......除非我真的误解了你的问题,特别是你的“没有填充字节”的评论。

重写 as 的定义struct

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

输出变为

size of myStruct is 9

这仅在编译时有效 - 所以它不是真正的“函数”。如果您在编译时不知道您的结构,则它不适用。因此,我认为我的答案与上面@unwind 给出的答案并没有矛盾。

于 2013-02-04T16:44:46.943 回答