怎样理解C++ 11中的trivial和standard-layout
发布网友
发布时间:2023-03-14 23:15
我来回答
共1个回答
热心网友
时间:2023-10-24 16:22
大体来说 trivial 类型表示这个类型可以用 malloc 分配内存(不调用默认构造函数)对应地用 free 交还内存(不调用析构函数),可以传给 memset/memcpy 这样的C函数(不调用复制赋值运算符),而不用担心破坏类型的不变式(invariant)而出错。
class A {
private:
int id;
public:
double num;
void set_id(int i) { id = i; }
void output() { std::cout << id << ' ' << num << '\n'; }
}; // A 是 trivial 类型
int main() {
A a;
a.set_id(1);
a.num = 2;
A* p = (A*)malloc(sizeof(A));
memcpy(p,&a,sizeof(A));
p->output(); //输出`1 2`
free(p);
}
standard-layout 类型的内部布局是可以预测的。
class B { private:
int id;
double num;
public:
B(){ id = 42; num = 0; }
void output() { std::cout << id << ' ' << num << '\n'; }
}; // B 是 standard-layout 类型
int main() {
B b;
b.output(); // 输出`42 0`
*(int*)(&b) = 1;; // 把b的起始地址对应的内存区域当作int类型,赋值为1
// 被改写的一定是 b.id
b.output(); // 输出`1 0`
}