c++ - 内联结构成员

标签 c++ struct

我有一个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;
}

32 24 24


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)属性。
从技术上讲,潜在的重叠足以使编译器重新使用填充。但是,不幸的是,能够重用填充并不能保证重用,并且在实践中,某些语言实现不会重用平凡可复制的标准布局类型的填充。我们可以通过使子对象不可平移或非标准布局来解决此问题。

I can't modify [Bar]


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

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

相关文章:

头文件中的 C++ 模板方法

c - flexible array member not at end of struct错误的原因是什么?

c++ - 为什么结构体的 sizeof 不等于每个成员的 sizeof 之和?

c - 从 csv 读取数据时出现问题

c++ - (C++) 这些重载运算符函数有什么区别?

c++ - 简单字符串代码中没有匹配 'operator=='

c++ - 如何在C++中查找字符串中子字符串的出现次数和位置

c++ - 将左值与抽象类一起使用

c - C 中结构的动态内存分配问题

c++ - 将所有成员从一个结构复制到另一个结构