怎样理解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`
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式