我有一个结构Foo,它包含一个嵌套的结构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;
}32 24 24
演示
我理解这是因为Bar被填充到24个字节,所以Foo添加了一个int,然后这个int被填充到32个字节。我不想把Bar或Foo标成人满为患。我想知道是否有任何方法告诉编译器不要将Bar存储为一个结构,而是只包含它的成员?类似于:
struct Foo {
inline Bar b; // Keyword inline doesn't work here.
int d;
};发布于 2020-12-01 07:56:48
我们必须允许该成员成为一个潜在的重叠子对象。有两种方法: 1.不使用成员,而是从Bar或2继承。使用属性[[no_unique_address]] (C++20)。
从技术上讲,潜在的重叠足以让编译器重复使用填充。然而,遗憾的是,能够重用填充并不能保证重复使用,而且在实践中,某些语言实现不会重复使用一些可复制的标准布局类型。我们可以通过使子对象不可复制或非标准布局来解决这一问题。
我不能修改条形
然后,使它成为非琐碎的可复制的标准布局类型是不可能的,因此某些语言实现不会重用填充。
https://stackoverflow.com/questions/65086382
复制相似问题