首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >衬砌构件

衬砌构件
EN

Stack Overflow用户
提问于 2020-12-01 07:34:35
回答 1查看 64关注 0票数 1

我有一个结构Foo,它包含一个嵌套的结构Bar。这些结构只包含POD类型。我的问题是,Foo的大小比复制Bar的所有成员时都要大。

代码语言:javascript
复制
#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个字节。我不想把BarFoo标成人满为患。我想知道是否有任何方法告诉编译器不要将Bar存储为一个结构,而是只包含它的成员?类似于:

代码语言:javascript
复制
struct Foo {
    inline Bar b; // Keyword inline doesn't work here.
    int d;
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-01 07:56:48

我们必须允许该成员成为一个潜在的重叠子对象。有两种方法: 1.不使用成员,而是从Bar或2继承。使用属性[[no_unique_address]] (C++20)。

从技术上讲,潜在的重叠足以让编译器重复使用填充。然而,遗憾的是,能够重用填充并不能保证重复使用,而且在实践中,某些语言实现不会重复使用一些可复制的标准布局类型。我们可以通过使子对象不可复制或非标准布局来解决这一问题。

我不能修改条形

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65086382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档