怎样理解C++ 11中的trivial和standard-layout
推荐于2016-07-04
展开全部
大体来说 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`
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询