我有一个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个字节。我不想将Bar
或Foo
标记为已打包。我想知道是否有任何方法告诉编译器不要将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/