(Visual Studio的)警告C4718究竟是什么
What exactly is warning C4718 (of Visual Studio)?
msdn链接
此处的文本:
"函数调用":递归调用没有副作用,删除
A函数包含一个递归调用,但在其他方面并没有副作用。正在删除对此函数的调用。程序不受影响,但行为受影响。而离开呼叫中可能导致运行时堆栈溢出异常,删除呼叫消除了这种可能性。
引起此警告的代码是:
template<class Key, class Value>
void Map<Key, Value>::Clear(NodeType* pNode)
{
((Key*) (pNode->m_key))->~Key();
((Value*) (pNode->m_item))->~Value();
NodeType* pL = pNode->GetLeftChild();
NodeType* pR = pNode->GetRightChild();
if (pL != &m_dummy)
{
Clear(pL);
}
if (pR != &m_dummy)
{
Clear(pR);
}
}
还有一点:这个警告只发生在版本构建(/Ox)中
这个警告是什么?谢谢
我敢打赌,当~Key
和~Value
没有操作时,就会发生这种情况。编译器会注意到,这个函数实际上没有其他尝试,所以它完全消除了这个函数。
对于初学者来说,警告只发生在版本构建中,因为它是优化的结果,优化器只在版本构建期间运行。
如果优化器能够证明这不会改变程序行为,那么它可以重组或消除代码,包括递归调用可能有一些依赖于数据的路径,其中对左右节点的Clear()的一个或两个调用都没有效果
编辑:正如@MSchangers所指出的,Key和Value的析构函数更有可能没有操作——如果Key和Value都是普通的旧数据结构或简单类型,它们就会是这样,因为析构函数是编写的函数中唯一可能的副作用。
编辑2:与其使用placement new,为什么不使用:initializer?
template struct Map<typename Key, typename Value> {
Key key;
Value value;
Map(Key k, Value v) : key(k), value(v) {}
}
相关文章:
- 传递给std::function template的template参数究竟代表什么
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 究竟如何工作范围?
- 当使用对象名称后带有 [] 的类对象时,您究竟会传入什么.C++
- 哪种方式更快?究竟发生了什么,我们没有看到什么?
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- 串行端口写入究竟如何从缓冲区实际写入数据?
- DrawShadow 中的 Elevation 究竟有什么作用?
- 究竟是什么设置了_WIN32或_WIN64预处理器?
- 我的重复检查代码中的错误究竟在哪里?
- GCC 的 -Wpsabi 选项究竟有什么作用?压制它意味着什么?
- 这个编译器错误究竟希望我执行什么?
- 查找表究竟是如何工作的,以及如何实现它们
- 在陈述"Implementation-defined"时,什么样的软件是"Implementation"的一部分?究竟什么是"Implementation"?
- 变量或标识符存储在C++中究竟在哪里?
- 究竟什么是"位填充"或"填充位"?
- 究竟发生了什么,我们需要在 c++ 中双重调度/访客
- 内存分配究竟是如何发生的,Java和C如何交互以跟踪同一对象?
- std::async 究竟是如何执行的?
- (Visual Studio的)警告C4718究竟是什么