以下代码中的解决方案
Class A{}
void func(){}
printf("%d,%d",sizeof(A),sizeof(func));
答案 0 :(得分:6)
空类的大小不为零(最可能为1),以便在不同的地址处有两个类的对象。
http://www2.research.att.com/~bs/bs_faq2.html#sizeof-empty更好地解释了
class A{};
void func(){}
std::cout<<sizeof(A)<<std::endl<<sizeof(&func));// prints 1 and 4 on my 32 bit system
答案 1 :(得分:3)
您正在使用无法完成的功能的大小。您需要在名称前加上&
,以获取指向该函数的指针的大小。您还需要将sizeof
值转换为类型int
,这是printf
对d
说明符所期望的值
printf("%d,%d", (int)sizeof(A), (int)sizeof(&func));
至于具体的价值观----不知道它们之外的是什么大于或等于1
。这取决于编译器。
答案 2 :(得分:0)
按sizeof(func)
,您可能意味着sizeof(&func)
,这是函数指针的大小(以字节为单位)。
就A
对象的大小而言,标准只说:
类类型的完整对象和成员子对象应具有非零大小。
符合脚注94:
基类子对象不受限制。
脚注的原因是允许编译器优化,称为empty member optimization,它通常用于模板库中以访问类类型的例程(例如,分配器类类型的分配器例程),而不需要该类类型的成员对象。