获取成员变量的大小

BЈо*_*вић 25 c++ c++11

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

struct foo
{
   short a;
   int b;
   char c[50];
   // ...
};
Run Code Online (Sandbox Code Playgroud)

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

我知道这会奏效:

foo fooObj;
std::cout << sizeof( fooObj.a ) << std::endl;
std::cout << sizeof( fooObj.b ) << std::endl;
std::cout << sizeof( fooObj.c ) << std::endl;
Run Code Online (Sandbox Code Playgroud)

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

std::cout << sizeof( foo().a ) << std::endl;
Run Code Online (Sandbox Code Playgroud)

Cat*_*lus 42

你可以在C++ 0x中做到这一点:

sizeof(foo::a);
Run Code Online (Sandbox Code Playgroud)


Eri*_*rik 27

5.3.3/1:

sizeof运算符产生其操作数的对象表示中的字节数.操作数是表达式(未计算)或带括号的type-id.

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

sizeof( ((foo *) 0)->a);
Run Code Online (Sandbox Code Playgroud)

  • @Martin:但他写了一个宏,你会说*"太多的工作,它隐藏了实际意义."*:P (4认同)
  • @Nawaz:但基于上面的标准.OP的原始注释成立,`sizeof(foo().a)`是有效的,定义良好,对象不构造,不丑陋,不需要额外的误导宏工作. (2认同)

Con*_*ius 11

使用此表格:sizeof(foo::a)相反.


小智 9

使用明显的:

sizeof( foo::a )
Run Code Online (Sandbox Code Playgroud)

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

  • 这是行不通的,因为`a`不是静态成员. (4认同)