如果有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;
答案 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
答案 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