c – 自动对象销毁
发布时间:2020-12-16 10:19:59 所属栏目:百科 来源:网络整理
导读:自动对象(在堆栈上创建的对象)的销毁是否可以保证在它们超出范围之前执行? 澄清: #include iostreamclass A { public: A() { std::cout "1"; } ~A() { std::cout "3"; }};void test123() { A a; std::cout "2";} 要打
自动对象(在堆栈上创建的对象)的销毁是否可以保证在它们超出范围之前执行?
澄清: #include <iostream> class A { public: A() { std::cout << "1"; } ~A() { std::cout << "3"; } }; void test123() { A a; std::cout << "2"; } 要打印“2”,不再需要a,所以从理论上讲,编译器可以在不再需要时尝试优化和销毁a. 我可以依靠以上功能始终打印123吗? 解决方法
严格定义堆栈对象的销毁顺序 – 当您离开作用域时(通过运行{}的结尾,或通过返回或异常),它们以与声明相反的顺序执行.所以,你总会在那里看到123.
但请注意,编译器优化由“as-if”规则控制.换句话说,编译器可以尽早销毁对象,只要生成的程序表现为’as-if’它在正常时被销毁.在这种情况下,因为您输出,编译器必须在适当的时间安排输出.但是,例如,如果您删除了指向基本类型的指针,并且编译器可以证明没有其他未指向该值的指针,原则上它可以更早地移动该删除.关键是没有符合要求的程序能够注意到这种优化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |