【问题标题】:Struct size stays the same even after adding a new member to it即使在向其添加新成员后,结构大小也保持不变
【发布时间】:2014-11-14 06:07:56
【问题描述】:

什么时候执行

cout << sizeof(string);

我得到了 8 个答案。

现在我有了一个结构

typedef struct {
    int a;
    string str;
} myType;

我正在执行

cout << sizeof(myType);

我的答案是 16。

现在我改变了我的结构

typedef struct {
    int a, b;
    string str;
} myType;

我正在执行

cout << sizeof(myType);

我得到了 16 作为答案!!!。如何?发生了什么?

【问题讨论】:

  • 在 ideone.com (ideone.com/6LYvXN) 的编译器配置产生 12 作为结构的大小。
  • 请不要做 typedef struct { ... } typename;那就是 C。虽然它在 C++ 中是为了向后兼容而允许的,但它不是惯用的。真是烦人。使用 struct typename { ... };
  • 谢谢@Rob K 我会记住这一点,我不会再重复了

标签: c++ string struct


【解决方案1】:

也许padding 正在发生。例如。 sizeof(int) 可以是 4 个字节,编译器可以在 a 之后添加 4 个字节以进行数据对齐。布局可能是这样的:

typedef struct {
    int a;      // 4 bytes
                // 4 bytes for padding
    string str; // 8 bytes
} myType;

typedef struct {
    int a;      // 4 bytes
    int b;      // 4 bytes
    string str; // 8 bytes
} myType;

【讨论】:

  • sizeof(int) 仅为 4 个字节
  • @Venkatesh 这正是我所期望的。
  • 感谢您的回答@AlexD
【解决方案2】:

看起来像 8 字节对齐。

因此,如果您有任何少于 8 个字节的数据类型,它仍将使用 8 个字节。

我假设指针是 8 个字节,而 int 每个只有 4 个字节。

您可以使用此处列出的代码强制 1 字节对齐 Struct one-byte alignment conflicted with alignment requirement of the architecture? 。然后,您应该为第一种情况获得不同的尺寸。

【讨论】:

  • “因此,如果您有任何少于 8 个字节的数据类型,它仍将使用 8 个字节”,这并不完全正确。 std::string 在这种情况下与 8 个字节对齐,因此没有任何数据会使用 8 个字节,这取决于该数据之后的内容。
  • 是的,在这种情况下。我假设 std::string 在这里是 8 个字节,因为它是一个(64 位)指针并且也是 8 个字节对齐的?!
【解决方案3】:

称为结构打包以实现最佳的内存对齐。

请参阅The Lost Art of C Structure Packing 以了解其方式和原因。在 C 和 C++ 中都是以相同的方式完成的。

【讨论】:

    【解决方案4】:

    在 C/C++ 中,结构被“打包”在字节块中。您可以指定应打包的结构的大小。 这里有一个参考:http://msdn.microsoft.com/en-us/library/2e70t5y1.aspx

    【讨论】:

    • 结构中的 C 数据与 C++ 中的对齐方式相同
    • 是的,完全正确,确实 C++ 是基于 C 的……为什么是 -1?
    • 不回答问题。
    • 链接中的示例确实解释了 sizeof 结果的原因。
    • @cabbi:我们不是来留链接的,而是来回答问题的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 2018-01-07
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多