3

据我所知,C++ 中的 void 指针void*可以指向任何东西。如果我想在不使用某种继承的情况下开发解决方案,这可能非常有用(对我来说)。但我想知道的问题是这种方法是否存在任何性能缺陷?

4

7 回答 7

9

最大的缺点是使用 void 指针会阻止编译器执行类型检查。尤其是在支持面向对象原则的语言中,我认为大量使用 void 指针会很奇怪。

您更有可能在 C 中找到 void 指针来模仿一些多态行为,但存在相同的类型安全问题。

于 2013-02-19T16:05:09.883 回答
5

有两个严重的性能缺陷void*。首先是它使程序的理解和维护变得更加困难,这对维护程序员的性能和运行时产生了严重影响,因为当分析器显示你在哪里时,它会使重新设计软件变得更加困难。有性能问题。最快的程序是首先编写好的程序,因为这样就可以在关键位置进行局部优化,而无需重写整个程序。

第二个性能影响是 avoid*可以给任何东西起别名。正确的别名分析是编译器优化的重要组成部分,任何使这变得更加困难的事情都会阻碍优化器,并可能导致代码变慢。(char*并且unsigned char*有类似的效果。)

于 2013-02-19T16:22:22.700 回答
4

void*除了编译器无法对其指向的类型做出假设之外,使用 a 时没有性能缺陷。它仍然像其他指针一样。

Avoid*在 C 中对于指向任意类型很有用,因为任何指向对象类型的指针都可以转换为 a void*。然而,用它做几乎任何事情都会导致未定义的行为。您只能安全地将其转换回原始指针类型。

但是,在 C++ 中,我们有一种更好的方法来存储指向任意类型的指针——模板。对于某些模板参数T,我们可以有一个T*.

于 2013-02-19T16:07:05.587 回答
1

void*可以指向任何东西。如果我想在不使用某种继承的情况下开发解决方案,这可能非常有用(对我来说)

如果您正在考虑将void*指针传递给某个函数,请考虑一下它的使用方式。为了调用该对象的方法或访问其成员,无论如何您都需要知道该对象的类型。

void*仅在确实需要时使用。如果您正在寻找一种如何以更通用的方式处理对象的方法,那么只需进行适当的 OO 设计。当你有一个void*指针时,你唯一知道的就是“内存中这个地址有东西”,仅此而已。

使用void*指针的性能与任何其他指针相同。代码的安全性、可理解性以及与之相关的可扩展性可维护性应该是您关心的问题。

于 2013-02-19T16:05:49.490 回答
1

可能仍然存在 avoid*大于其他类型的指针的平台,或者具有不同的格式,因此转换为或void*转换为实际的转换代码。在常见的(x86,ARM)硬件上,情况并非如此,所以没有性能问题void*——你只是放弃了类型安全。

于 2013-02-19T16:06:59.100 回答
1

是的 - 您可能会有一些性能缺陷。通过使用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)

有关严格混叠的更多信息

于 2013-02-19T16:26:32.857 回答
0

我不明白为什么在使用 void 指针而不是任何其他类型的指针时会出现任何性能问题。我会更关心安全性,你放弃了一个 void 指针。

于 2013-02-19T16:03:41.440 回答