【问题标题】:why not eliminating the need to padding bytes regarding this structure?为什么不消除有关此结构的填充字节的需要?
【发布时间】:2013-03-29 23:57:12
【问题描述】:

考虑以下简单结构:

struct Struct {
public:
  char  a;
  short int b;
  char  c;
};

如果此结构的实例放置在偶数(16 位对齐)地址,则需要两个填充字节来修复对齐(@9​​87654323@ 和数组中的任何后续实例)。

但是,实例可以放置在奇数地址,然后即使没有填充字节,对齐仍然是正确的。

所以我做了一个测试,发现 Visual C++ 2010 会添加这两个填充字节,这表明它总是将它们放在偶数地址。

为什么 VC++ 不将它们放置在奇数地址,每个对象节省 2 个字节? 有什么我不知道的吗?

【问题讨论】:

  • 我尝试解析下面的句子,但在两次尝试后放弃了:对齐的内存访问将适用于其中的每个成员,即使它们有一个数组并且每个对象的大小为 4 个字节,但如果它们总是放置在偶数地址,则需要向对象添加两个填充字节以允许对齐的内存访问使其大小为 6 并增加了 2。
  • 我不太确定你在问什么,但如果问题是如何摆脱该结构中的填充,你可以在定义之前添加语句#pragma pack(1);这应该将大小更改为4
  • 正确对齐元素可能会提高性能,但会浪费一些空间。编译器如何知道您想节省空间但不关心性能?你有十亿条记录,所以空间很重要吗?
  • @BoPersson 问题是为什么编译器不选择实现这两个目标的解决方案。

标签: c++ visual-studio-2010 visual-c++ padding memory-alignment


【解决方案1】:

确实,如果该结构的布局没有填充,那么它可以放置在一个奇数地址,并且它的每个成员都会单独正确对齐。

问题是编译器如何将它放在一个奇数地址。可以肯定的是,可以为自动存储变量安排。但是由malloc 分配的堆分配变量呢? malloc 遵守的约定是它必须返回一个内存块,该内存块对于任何类型的对象都正确对齐。如果有一些对象需要放置在奇数地址,malloc 永远不会这样做。

【讨论】:

    【解决方案2】:

    你可以把它变成这样来解决这个问题:

    struct Struct{
    public:
        short int b;
        char a;
        char c;
    };
    

    这会在许多编译器上导致sizeof(Struct) == 4

    【讨论】:

    • 这当然是正确的,但它几乎没有解决实际提出的问题。
    • 但它确实解决了提问者面临的问题,即“浪费空间”。不可否认,另一个大卫(你)给出的答案比我的更有趣。
    • 好吧,我们不知道“问题”是什么。也许@Pooria 试图理解为什么事情是这样的。
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2016-08-06
    • 2015-05-29
    • 2018-11-11
    • 2013-03-14
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    相关资源
    最近更新 更多