C++:抽象联合和新放置运算符的行为?
C++: Behavior of abstract union and new placement operator?
据我所知,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;
}
我的理解是工会的规模是该工会中最大的成员。
不完全是。如果一个成员具有更严格的对齐要求,而另一个成员较大,但不是上述对齐的倍数,则联合的总大小可能大于任一成员。
有谁知道当非固定大小的容器时工会的行为
C++中没有非固定大小类型。所有类型都有一个编译时常量大小。动态容器从免费存储中分配内存,并使用恒定大小的指针间接引用该内存。
尺寸是多少?
它正好是sizeof(X)
个字节。
此外,使用新的放置操作时,大小如何变化?
它不会改变。
sizeof(std::string(总是相同的,无论字符串是空的还是包含字符串的。 需要新的放置运算符的唯一原因是联合中存在字符串,因为字符串和 int 之间共享存储。
相关文章:
- 如何使用新运算符跟踪在循环中创建的 QLabel
- 如何理解新的运算符重载?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 运算符重载 += 添加新对象
- 是否可以转换 c++ 运算符新输出?
- 放置运算符新查找
- 编译器忽略运算符新分配
- C++运算符新重载、编译错误
- 内置运算符(新的,删除和函数调用除外)如何返回
- 重载全局运算符新(非 POD)
- 运算符新[]和非POD类型
- 标准全局默认运算符新的对齐限制是什么?
- C++:运算符新的默认构造函数
- “::运算符新”有什么作用
- 运算符新字段值在多重继承中具有错误的偏移量
- 运算符新参数
- 重载运算符新-误导性输出
- 我是否可以使用不同的返回类型重载"运算符新"?
- 调试断言失败与字符串流::灌输和自定义全局运算符新
- 为什么SGI STL源代码在运算符新函数前面使用双冒号