【问题标题】:Avoid struct padding in C++避免 C++ 中的结构填充
【发布时间】:2012-11-01 14:20:50
【问题描述】:

在我的代码中,我有以下struct

struct foo {
 int a;
 int b;
};

b 中,仅存储 0 到 100 之间的值。所以总的来说,我可以用char 替换它。但由于填充效应,struct 的大小相同。由于我的代码包含这些结构中的vectorssets 以及数百万个条目,因此如果我能以某种方式规避填充,它将使内存使用量减少三分之一以上。有没有可能这样做,例如其他一些行为相同的(增强)数据容器?

编辑: 我在 Linux 系统上同时使用 GNU 和 Intel 编译器:

【问题讨论】:

  • 你需要一个structpack-ing。取决于您的编译器,您可以使用(可能是pragma pack)来告诉您的编译器,而不是添加填充。
  • @Kiril 你为什么不添加这个作为答案?
  • 也许你可以把你的结构一分为二。
  • 您真的需要打包吗?大多数处理器在本机大小(整数)上比较小的大小更有效。此外,处理较小的尺寸可能需要额外的处理时间;检查你的汇编代码。 打包是否会为您节省大量内存空间?
  • @ThomasMatthews:我做了一些基准测试:我的代码中处理这些数据的部分在打包数据时会慢 10% 左右。但是这部分只占整个运行时间的 1%,所以额外的减速并不重要。但是,数据占代码内存使用量的 30% 以上。

标签: c++ memory-management data-structures struct


【解决方案1】:

正如社区所建议的那样,将我的评论作为答案 :)

这取决于编译器。你需要的是使用structpacking。

对于 Visual Studio,您需要 #pragma pack,对于 gcc,您需要使用属性 packed

欲了解更多信息,请参阅C++ struct alignment question

希望对您有所帮助,抱歉我现在无法真正测试它,但这正是您所需要的

【讨论】:

    【解决方案2】:

    没有使用特殊的#pragmas 来控制结构填充/对齐,您可以拆分ab 并将它们存储在单独 vectors 和“匹配”中它们按索引。

    至于sets,即使您可以轻松地将结构拆分为其组成部分(从纯逻辑的角度来看,您可能无法做到——sets 没有索引),您仍然会为动态内存管理对齐付费,这可能会抹去您可能获得的任何优势。

    【讨论】:

      猜你喜欢
      • 2015-04-05
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2010-10-26
      • 2023-04-03
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多