据我所知,C++ 中的 void 指针void*
可以指向任何东西。如果我想在不使用某种继承的情况下开发解决方案,这可能非常有用(对我来说)。但我想知道的问题是这种方法是否存在任何性能缺陷?
7 回答
最大的缺点是使用 void 指针会阻止编译器执行类型检查。尤其是在支持面向对象原则的语言中,我认为大量使用 void 指针会很奇怪。
您更有可能在 C 中找到 void 指针来模仿一些多态行为,但存在相同的类型安全问题。
有两个严重的性能缺陷void*
。首先是它使程序的理解和维护变得更加困难,这对维护程序员的性能和运行时产生了严重影响,因为当分析器显示你在哪里时,它会使重新设计软件变得更加困难。有性能问题。最快的程序是首先编写好的程序,因为这样就可以在关键位置进行局部优化,而无需重写整个程序。
第二个性能影响是 avoid*
可以给任何东西起别名。正确的别名分析是编译器优化的重要组成部分,任何使这变得更加困难的事情都会阻碍优化器,并可能导致代码变慢。(char*
并且unsigned char*
有类似的效果。)
void*
除了编译器无法对其指向的类型做出假设之外,使用 a 时没有性能缺陷。它仍然像其他指针一样。
Avoid*
在 C 中对于指向任意类型很有用,因为任何指向对象类型的指针都可以转换为 a void*
。然而,用它做几乎任何事情都会导致未定义的行为。您只能安全地将其转换回原始指针类型。
但是,在 C++ 中,我们有一种更好的方法来存储指向任意类型的指针——模板。对于某些模板参数T
,我们可以有一个T*
.
void*
可以指向任何东西。如果我想在不使用某种继承的情况下开发解决方案,这可能非常有用(对我来说)
如果您正在考虑将void*
指针传递给某个函数,请考虑一下它的使用方式。为了调用该对象的方法或访问其成员,无论如何您都需要知道该对象的类型。
void*
仅在确实需要时使用。如果您正在寻找一种如何以更通用的方式处理对象的方法,那么只需进行适当的 OO 设计。当你有一个void*
指针时,你唯一知道的就是“内存中这个地址有东西”,仅此而已。
使用void*
指针的性能与任何其他指针相同。代码的安全性、可理解性以及与之相关的可扩展性和可维护性应该是您关心的问题。
可能仍然存在 avoid*
大于其他类型的指针的平台,或者具有不同的格式,因此转换为或void*
转换为实际的转换代码。在常见的(x86,ARM)硬件上,情况并非如此,所以没有性能问题void*
——你只是放弃了类型安全。
是的 - 您可能会有一些性能缺陷。通过使用void *
,您可以禁用基于严格混叠假设的优化。
例子
void fun(void * param1, int & param2)
{
param2 = 7; // 1
// do something with param1, param2 not used
param2 += 1; // 2
}
如果没有void *
变量,编译器可能会删除赋值 1 并在 2 中只生成param2 = 8
。但现在它不能,因为param1
可能指向param2
,如果你调用了fun(&i, i)
。
我不明白为什么在使用 void 指针而不是任何其他类型的指针时会出现任何性能问题。我会更关心安全性,你放弃了一个 void 指针。