【问题标题】:C++: Behavior of abstract union and new placement operator?C ++:抽象联合和新放置运算符的行为?
【发布时间】:2020-06-08 16:46:16
【问题描述】:

据我了解,union 的大小是该工会中最大成员的大小。有谁知道在将诸如string 之类的非固定大小容器添加到联合时,联合的行为如何?尺寸是多少?另外,当使用新的放置操作时,尺寸如何变化?谢谢!

这是一个例子:

#include <string>
using namespace std;

class X {
public:
    union {
        int i;
        string s;
    };
    X(string ss) { new(&s) string{ss}; };
    ~X() { s.~string(); };
};

int main(int argc, char *argv[])
{
    X xx{"abc"};

    return 0;
}

【问题讨论】:

  • sizeof(std::string) 永远不会改变。另请参阅:stackoverflow.com/questions/40106941/…
  • 确实,您可能会惊讶地发现sizeof(std::string) 始终相同,无论该字符串为空还是包含所有哈利波特书籍的全部内容。
  • 是不是因为容器字符串有一些指向字符串实际数据的指针?
  • 实际上,是的。 std::vector 和所有其他容器也是如此。 C++ 中所有对象的大小永远不会改变。这是基本的,std::string 为您正确管理所有内存。容器也是如此。这就是为什么现代 C++ 代码很少需要使用 newdelete
  • 是的,确实如此。当联合包含非 POD 时,您有责任按顺序正确地构造和销毁联合成员,一次一个。但是,如何将这种头痛强加给自己?只需使用std::variant,它也会为您完成所有这些工作。

标签: c++ unions


【解决方案1】:

据我了解,工会的规模是该工会中最大成员的规模。

不完全是。如果一个成员有更严格的对齐要求,而另一个成员更大,但不是提到的对齐的倍数,则联合的总大小可能大于任一成员。

有谁知道当一个非固定大小的容器时联合的行为是什么

C++ 中没有非固定大小的类型。所有类型都有一个编译时常量大小。动态容器从空闲存储中分配内存,并通过常量大小的指针间接引用该内存。

尺寸是多少?

正好是sizeof(X) 字节。

另外,当使用新的放置操作时,尺寸如何变化?

它不会改变。

【讨论】:

    【解决方案2】:

    sizeof(std::string) 始终相同,无论字符串为空还是包含字符串。需要新的放置操作符的唯一原因是由于联合中存在字符串,因为存储在字符串和 int 之间共享。

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多