在没有填充字节的情况下计算结构大小的函数

时间:2013-02-04 16:41:29

标签: c++ c struct

嗨我想创建一个无填充字节来计算结构大小的函数。

示例:

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

如果我计算上述结构的大小,我必须得到9个字节(即没有填充字节)

考虑我可能不知道struct中存在的变量的情况。

示例:

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

所以,如果我计算尺寸,它应该给出正确的尺寸。

是否有可能写这样的功能?我尝试阅读结构,但我找到任何解决方案。我看到有一些编译器选项存在,我可以得到但我不想要任何构建编译器选项。

2 个答案:

答案 0 :(得分:3)

不,C没有足够的内省来实现这一目标。在运行时,没有信息可以让程序“知道”结构中的哪些字段,或者它们的类型是什么。

答案 1 :(得分: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'。 我认为这是你的答案......除非我真的误解了你的问题,特别是你的“没有填充字节”评论。

struct的定义重写为:

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

输出变为

size of myStruct is 9

这仅适用于编译时 - 因此它不是真正的“功能”。如果你在编译时不知道你的结构,它就不适用。因此,我认为我的答案和@unwind上面给出的答案并不矛盾。