![]() |
1
3
这个代码有一些问题。
首先,您不需要调用析构函数。
也就是说,你的评论让我相信你的意思是其他的,比如:
稍后:
当然,没有必要删除任何内容,因为我们使用了向量。这是调用析构函数的正确语法。 它会被优化吗?这取决于编译器是否可以确定析构函数是否什么也不做。如果析构函数是由编译器生成的,我相信它会删除毫无价值的循环。如果析构函数是用户定义的,但在头中,它还可以看到它什么也不做,并移除循环。 但是,如果它在其他对象文件中,我认为它不会,即使它是空的。这取决于编译器在链接阶段进行优化的能力。了解的最好方法是查看生成的程序集。 |
![]() |
2
3
调用析构函数的正确语法是
该语法对类型(如int(作为模板参数传递时)有效,但不是op(不执行任何操作),因此模板代码(如
IMO编译器应该很容易看到循环内容包含no op,因此整个循环本身没有副作用,因此移除整个循环。现代编译器有非常复杂的优化程序,应该能够删除没有效果的代码。如果编译器
没有
删除多余的循环,它将在
当然,如果您在一个在析构函数中确实有效的类上调用析构函数,那么它仍然必须被调用,并且仍然会有一个循环(受制于其他相关的优化,如展开)。 另一个简单的基于副作用的优化示例是这样的代码:
可能会被优化为只打印常量1000000而不进行处理,因为编译器足够聪明,可以知道总体的副作用是
|
![]() |
3
0
您不会像上面所做的那样创建动态数组。您可以这样做:
除了上面的循环,也不会调用析构函数。如果类有一个重载的“~”运算符,那么它将调用该代码。 所以不……没有编译器会优化这个循环。代码也不太可能编译。 |
![]() |
AstralHex · 矩阵乘法代码工作不正常 3 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 3 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 3 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 3 月前 |