假设我有一个C / C ++结构
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?
答案 0 :(得分:4)
这种结构在技术上可能有填充。即使只包含一个成员的结构的简单情况也可以有填充:
答案 1 :(得分:1)
在Visual C ++中,可以使用#pragma pack
来更改结构的填充;该值可以设置为大于sizeof(double)
,即8。文档显示了将其设置为16的示例。
答案 2 :(得分:0)
就您关于std::vector
的具体问题而言,可以找到您在上面提出的等效性是否有效的答案{。{3}}。
答案 3 :(得分:0)
从理论上讲,这是可能的。实际上,我会有点惊讶地看到它(例如,如果你将类型从double
改为short
,填充会变得不那么令人惊讶)。
使用MS VC,#pragma pack
仅导致对齐(最多)对象的大小:来自MSDN:
n(可选)
指定要用于打包的值(以字节为单位)。 n的默认值为8.有效值为1,2,4,8和16.成员的对齐将位于边界上,该边界是n的倍数或成员大小的倍数,< strong>以较小者为准。 [强调补充]
这意味着包含多个相同类型成员的结构将永远不会在它们之间插入填充。 #pragma pack
控制可以插入的最大填充量,而不是最小值。