获取成员变量的大小

时间:2011-05-12 10:50:06

标签: c++ c++11

如果有POD结构,带有一些成员变量,例如:

struct foo
{
   short a;
   int b;
   char c[50];
   // ...
};

有没有办法以字节为单位获取成员变量的大小,而不创建这种类型的对象?

我知道这会奏效:

foo fooObj;
std::cout << sizeof( fooObj.a ) << std::endl;
std::cout << sizeof( fooObj.b ) << std::endl;
std::cout << sizeof( fooObj.c ) << std::endl;

编译器会优化以下内容并阻止构造对象吗?

std::cout << sizeof( foo().a ) << std::endl;

7 个答案:

答案 0 :(得分:37)

您可以在C ++ 0x中执行此操作:

sizeof(foo::a);

答案 1 :(得分:26)

5.3.3 / 1:

  

sizeof运算符产生数字   对象表示中的字节数   它的操作数。操作数是   表达式未评估,   或带括号的type-id。

以上意味着以下结构定义明确:

sizeof( ((foo *) 0)->a);

答案 2 :(得分:11)

请使用此表单:sizeof(foo::a)

答案 3 :(得分:8)

使用明显的:

sizeof( foo::a )

在C ++中,sizeof总是在编译时进行评估,因此无需任何运行时成本。

答案 4 :(得分:1)

您可以创建@Erik建议的宏包装器:

#define SIZE_OF_MEMBER(cls, member) sizeof( ((cls*)0)->member )

然后将其用作:

cout << SIZE_OF_MEMBER(foo, c) << endl;

输出:

50

演示:http://www.ideone.com/ZRiMe

答案 5 :(得分:1)

C ++ - 0x允许你这样做:

  std::cout << sizeof( foo::a ) << std::endl;
  std::cout << sizeof( foo::b ) << std::endl;
  std::cout << sizeof( foo::c ) << std::endl;

C ++ - 0x允许sizeof在没有显式对象的情况下处理类的成员。

论文在这里:Extending sizeof to apply to non-static data members without an object (revision 1)

我看到关于上述内容的帖子为时已晚。遗憾。

答案 6 :(得分:-2)

struct foo
{
   short a;
   int b;
   char c[50];
   // ...
   static const size_t size_a = sizeof(a);
   static const size_t size_b = sizeof(b);
   static const size_t size_c = sizeof(c);
};

用法:

foo::size_a