获取成员变量的大小

Getting the size of member variable

本文关键字:变量 成员 获取      更新时间:2023-10-16

如果有一个 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;
你可以在

C++0x 中执行此操作:

sizeof(foo::a);

5.3.3/1:

运算符的大小产生数字 对象表示中的字节数 其操作数。操作数为以下任一 未计算的表达式, 或带括号的类型 ID。

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

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

请使用以下形式:sizeof(foo::a)

使用显而易见的:

sizeof( foo::a )

在C++中,sizeof 总是在编译时计算,因此没有任何运行时成本。

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 在没有显式对象的情况下处理类的成员。

论文在这里:扩展 sizeof 以应用于没有对象的非静态数据成员(修订版 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

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