2

假设我有一个 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?
4

4 回答 4

4

从技术上讲,这样的结构有填充是可能的。即使是仅包含一个成员的结构的简单情况也可以有填充:

C++ sizeof 包装类

于 2012-05-16T16:55:22.727 回答
1

在 Visual C++ 中,可以#pragma pack用来改变结构的填充;该值可以设置为大于sizeof(double)8。文档显示了将其设置为 16 的示例。

于 2012-05-16T17:00:03.180 回答
0

就您的具体问题std::vector而言,您在上面询问的等价是否有效的答案可以在此 stackoverflow 帖子中找到。

于 2012-05-16T17:18:40.427 回答
0

理论上是可以的。实际上,看到它我会有些惊讶(尽管例如,如果您将类型从 更改doubleshort,填充将变得不那么令人惊讶)。

使用 MS VC,#pragma pack只会导致(最多)对象的大小对齐:来自MSDN

n(可选)

指定用于打包的值(以字节为单位)。n 的默认值为 8。有效值为 1、2、4、8 和 16。成员的对齐方式将位于 n 的倍数或成员大小的倍数的边界上,以两者为准更小。[重点补充]

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

于 2012-05-16T17:21:15.777 回答