2010-06-20 59 views
-4

什么会在下面的代码空类和空函数的大小?

Class A{} 
void func(){} 

printf("%d,%d",sizeof(A),sizeof(func)); 
+0

PLZ给出同样的原因 – 2010-06-20 11:33:19

+3

你自己试过了吗?顺便说一句,你可以编辑你自己的问题,所以不需要留言。 – Troubadour 2010-06-20 11:35:01

+2

这不是如何声明一个类,为什么在C++中使用'printf',并且'sizeof'不能保证适合'%d'。 – 2010-06-20 11:36:06

回答

3

你正在服用哪些不能做一个函数的大小的解决方案。您需要在名称前面加上&以获取指向该函数的指针的大小。你还需要转换sizeof值为int类型,这是printf预计为d

printf("%d,%d", (int)sizeof(A), (int)sizeof(&func)); 

至于具体的数值----这不知道他们是什么超越是大于或等于1。这取决于编译器。

0

通过sizeof(func),你大概的意思sizeof(&func),这是在字节的函数指针的大小。

至于什么样的A物体的大小,标准只是说:

类类型的完整的对象和成员子对象应具有非零大小。

其通过脚注94合格:

基类的子对象并不受限制。

的原因脚注是允许称为empty member optimization一个编译器的优化,这是常用的模板库中使用,而无需一个构件访问类型的例程(例如一个分配器类类型的分配器例程)该类类型的对象。

+1

不同类型的指针不保证是相同的大小(虽然他们通常在实践中) – 2010-06-20 14:11:55

+0

@Oli Charlesworth:哇,我没有意识到指针大小可能不同,事实上,通过查看C和C++标准,我找不到任何强制两个指针类型的大小相等的东西,然而,从[5.2.10 ]重新解释转换:“指向函数的指针可以显式转换为指向不同类型函数的指针”,我认为这意味着两个* function *指针类型的大小至少是相同的。 – 2010-06-20 18:52:11

+1

数据指针和函数指针*的大小可能不同的一个例子是在具有哈佛架构(即单独的指令和数据存储器)的平台上。 – 2010-06-20 20:07:30