2012-05-16 91 views
2

假设我有一个C/C++结构只有“double”元素的结构是否有填充?

struct ABCTYPE 
{ 
    double A; 
    double B; 
    double C; 
}; 

是否保证有任何形式的现代平台没有微胖?

更具体地讲,如果我用

std::vector<ABCTYPE> storage; 
// add some elements 

// now i need some C routines to the data 
double* param=&(storage[0]); 
c_routine(param); // Tested OK on Win/Linux, but will it work on any platforms? 

回答

4

这在技术上是可能的这样一个结构有填充。甚至一个结构的仅含有一个构件的简单情况下可以具有填充:

C++ sizeof wrapper class

+0

是的。但我想知道如果我使用纯双重会发生什么。在我看来,double不应该填充,因为它有8个字节,64位,并且对于32位和64位乃至128位系统都有完美的对齐。 – xis

+0

没关系。作为一个编译器编写者,我可以实现C++,如果我愿意的话,所有的类/结构体都会使用无用的内存填充结构体。 –

1

在Visual C++,可以使用#pragma pack改变结构的填充;该值可以设置为大于sizeof(double)这是8文档显示它设置为16

+0

-1。海事组织虽然在技术上是正确的,但这个答案有误导性。正如在我的回答中指出的那样,如果将填充设置为16,则大小为8的成员仍将仅与8的倍数的地址对齐。 –

0

至于你具体问题的一个例子约std::vector推移,答案等价是否你问上方有效的可以发现in this stackoverflow posting

+0

No. std :: vector保证连续。但是,结构本身可能有填充。 – xis

0

理论上它是可能的。在现实中,我会有些惊讶地发现它(尽管例如,如果将类型从double更改为short,填充会变得不那么令人惊讶)。

与MS VC,#pragma pack只使对齐(至多)的对象的大小:从MSDN

N(可选)

指定值,以字节为单位,要使用的包装。 n的默认值是8.有效值是1,2,4,8和16.成员的对齐将位于n的倍数或成员大小倍数的边界上,以较小者为准。 [emphasis added]

这意味着包含相同类型的多个成员的结构将永远不会在它们之间插入填充。 #pragma pack最多可控制可插入的填充量,而不是最小值。