我有给定的程序?主函数的输出可以根据优化器而变化吗?
1)优化器可以在第19行
之后调用'a'的析构函数2)在第17行,任何优化器都可以优化此行,因为它没有在main中的任何地方引用?或者它是否依赖于类中的静态变量?
3)关于第17行,是否有可能优化器初始化数组对象并直接销毁它们,因为没有使用'b'?
1. class Test
2. {
3. public:
4. static int n;
5. Test()
6. {
7. n++;
8. }
9. ~Test()
10. {
11. n--;
12. }
13. }
14. int main()
15. {
16. Test a;
17. Test b[5];
18. Test *c = new Test;
19. std::cout << a.n << std::endl;
20. delete c;
21. std::cout << Test::n << std::endl;
22. return 0;
23. }
答案 0 :(得分:4)
只要符合(i)遵循标准并且(ii)进行优化没有副作用,优化者就可以做任何事情。
由于析构函数有副作用(n
的递减),因此必须在正确的位置调用它。特别是a
必须在删除c
后销毁。
请注意,在生产中,您希望对n
使用 atomic 类型:您目前的代码不是线程安全的。
另请注意,您main
的声明不正确。您必须使用int main()
或带有命令行参数的版本。从技术上讲,程序的行为是未定义。