2010-11-07 25 views
0

考虑在64位,这些结构:数据对齐和继承问题

struct base 
{ 
    long a; 
}; 

struct derived : public base 
{ 
    long b; 
    char c; 
}; 

我得到一个大小为24和填充警告,但我不明白为什么。 对我来说,用这种继承的数据排列像

a 
b 
c 

所以一个是在8对齐,B也和c是char和1 对准那么在这里,这是为什么问题大小是24?

+1

请同时发布您正在使用的编译器和确切的警告消息。 – 2010-11-07 22:28:23

+0

“填充警告”是什么意思? – jalf 2010-11-07 23:50:21

回答

1

有时编译器会选择使用所有元素的字大小来提高运行速度。例如,在GCC中,您可以强制使用

__attribute__((packed)) 

到结构体定义。你可以学习this GCC documenation。但是,我不确定在使用继承时可以使用什么关于对齐的假设。特别是,如果您使用虚函数,则由于将某些指针添加到结构中,大小可能会改变。

8

大小为24,因此当您制作struct derived的数组时,数组的第二个元素将具有8字节的对齐方式,即base::a

+0

+1:我当然没有考虑过这种可能性。 – Puppy 2010-11-07 23:06:17

+0

啊,这是一个结构对齐!谢谢 ! – fedj 2010-11-08 10:28:22