2012-06-05 67 views
3

答案应该很简单,但我想确保。是sizeof()递归吗?

sizeof()递归?例如,

struct foo 
{ 
    DWORD a; 
    DWORD b; 
}; 

struct bar 
{ 
    DWORD c; 
    foo d; 
}; 

将一个sizeof(bar)包括foo大小,返回一个完整的12个字节(假定DWORD是4个字节)?

+8

这本来是很容易尝试了这一点为自己,不是吗? –

+1

确实;然而我想,因为谷歌没有给出任何额外的if和s或but's(即'某些编译器做x'等),并且没有向前回答,我认为这是一个很好的q/a公开如果有人想要一个快速的答案可用。我知道我可以在几秒钟内测试这个;) – Qix

+1

@SimonAndréForsberg:不会。它只会告诉你,你的编译器使它成为12个字节。但是由于编译器可能会插入填充,所以不能一概而论。 – MSalters

回答

5

是... sizeof给出了一个总直接包含在类型的所有成员,包括struct/class数据成员,非虚基类,一些实现定义的链接/计数器跟踪虚拟碱,虚拟调度表指针,填充有助于使数据成员与CPU安全或有效访问保持一致,理论上实现可能感觉就像放在那里一样! (例如,用于运行时调试/错误检测,垃圾收集的非标准支持......)

当然,它不包括指向或引用对象的大小,但包括这些指针和引用的大小。

+0

+1表示*“理论上其他任何实现可能感觉就像放在那里!”* – Nawaz

6

是的,sizeof运算符为您提供包含其所有成员的结构的大小。

但是请注意,编译器可能会添加自己的填充,所以实际大小可能/不可能等于结构成员大小的总和。

3

是的。 TC3:从ISO/IEC 9899摘录

当施加到具有结构或联合类型的操作数,其结果是字节在这样一个对象,包括内部和后填充的总数。

(重点煤矿)