我有一个struct Foo,其中包含嵌套的struct Bar。这些结构仅包含POD类型。我的问题是Foo的大小比如果我复制Bar的所有成员时要大:

#include <iostream>
#include <string>

struct Bar {
    double a;
    long long b;
    int c;
};

struct Foo {
    Bar b;
    int d;
};

struct Foo2 {
    double a;
    long long b;
    int c;
    int d;
};

int main()
{
  std::cout << sizeof(Foo) << std::endl;
  std::cout << sizeof(Bar) << std::endl;
  std::cout << sizeof(Foo2) << std::endl;
}

Demo
我知道发生这种情况是因为Bar被填充为24个字节,所以Foo添加了一个int然后被填充为32个字节。我不想将BarFoo标记为已打包。我想知道是否有任何方法告诉编译器不要将Bar存储为结构,而只包括其成员?就像是:
struct Foo {
    inline Bar b; // Keyword inline doesn't work here.
    int d;
};

最佳答案

我们必须允许该成员成为潜在重叠的子对象。有两种方法:1.从Bar继承或不使用成员,或者2.使用[[no_unique_address]](C++ 20)属性。
从技术上讲,潜在的重叠足以使编译器重新使用填充。但是,不幸的是,能够重用填充并不能保证重用,并且在实践中,某些语言实现不会重用平凡可复制的标准布局类型的填充。我们可以通过使子对象不可平移或非标准布局来解决此问题。

然后使其成为非平凡可复制的标准布局类型是不可能的,因此某些语言实现将不会重用填充。

关于c++ - 内联结构成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/65086382/

10-11 22:43
查看更多