问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎样理解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`
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
在爱水APP哪个模块中可以填写个人信息,查询自己一天的饮水量? 黄金为什么是避险产品 避险买什么 避险品种是什么 避险产品什么意思 什么是避险产品 ...对联和我们平时使用的印章,说说使用了哪几个字体 对联上写的是什么字 ...有一空是让我评价我自己,请各位哥哥姐姐帮帮忙,帮我编一段,往好了... 艾灸用品哪种好 84烧手怎么办 虞书欣小森林片酬 虞书欣和王鹤棣演的电视剧有哪些 虞书欣是学霸吗 劝学原文,及翻译 求《劝学》原文和对应的译文,最好要一句一句对应. 全用马字旁的字有诗句吗 对对子,作诗“川山山川穿山川”求一下联我对上了“流河河流留河流” 篱落疏疏一径深的一径是什么意思? 生蚝能放在冰箱里面保鲜吗? 据说曹操一生犯了三大致命错误,究竟是什么? 曹操犯了哪些战略错误? 煮酒论英雄时,曹操为何不杀刘备?曹操犯了什么错误? 曹操的一生中犯了哪些错误? 人非圣贤,孰能无过?被称为一代枭雄的曹操犯了哪些错误? 曹操一生5大错误:错睡1人,错杀1人,错留1人,错信1人,错放1人 ridibooks购买的书怎么看 中行个人手机银行绑卡记录要怎么看? 查看银行卡绑定了什么 花好月圆歌词完整版 琐碎的基本解释 铅酸电瓶和锂电池的优点有什么区别 怒海潜沙秦岭神树人物介绍 steam课程一期有几节课 常州威雅学校幼儿园STEAM课程的重点是什么? 以身许国同义词 曾巩城南是几年级课文 百年难遇的虎年宝宝命理详解 有荣华之命? qq约联系方式 梦见跟陌生人一起吃东西 启事是什么意思? 阿拉善雅玛利克沙漠如何 择天记的择怎么读 择天记,择什么拼音 择天记的拼音怎么写 为什么现在的南孚电池不耐用 为什么有时候南孚电池用不了? 梦见说自己活不久 怎么鉴别镜片的质量好坏? 怎样辨别镜片质量的好坏呢如何辨别镜片的好坏