【问题标题】:Will structs with only "double" element have padding?只有“双”元素的结构会有填充吗?
【发布时间】:2012-05-17 01:21:15
【问题描述】:

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

【问题讨论】:

    标签: c++ padding memory-alignment


    【解决方案1】:

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

    C++ sizeof wrapper class

    【讨论】:

    • 是的。但我想知道如果我使用纯双精度会发生什么。在我看来 double 不应该填充,因为它有 8 个字节,64 位,并且对于 32 位和 64 位甚至 128 位系统都有完美的对齐。
    • 没关系。作为编译器编写者,我可以实现 C++,如果我愿意,所有类/结构都可以用无用的内存填充结构。
    【解决方案2】:

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

    【讨论】:

    • -1。 IMO,虽然在技术上是正确的,但这个答案具有误导性。正如我在回答中指出的那样,如果您将填充设置为 16,则大小为 8 的成员仍将仅与 8 的倍数的地址对齐。
    【解决方案3】:

    就您关于std::vector具体问题而言,您可以在in this stackoverflow posting 中找到您在上面询问的等效性是否有效的答案。

    【讨论】:

    • 没有。 std::vector 保证是连续的。但是,结构本身可能有填充。
    【解决方案4】:

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

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

    n(可选)

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2014-09-14
      • 2016-12-13
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多