【问题标题】:"const *int" or just "int" as function-arguments. What is the difference? [closed]“const *int”或只是“int”作为函数参数。有什么区别? [关闭]
【发布时间】:2013-02-16 16:07:35
【问题描述】:
void test(const int* pInt)

void test(int pInt)  

我知道第一个示例使 pInt 受到某种保护。但是哪种解决方案可以提供更高的性能?因为两者(const 指针和普通 int)都必须在内存中注册。

【问题讨论】:

  • 第二个例子中的意思是void test(int *pInt)
  • 不!我的意思是一个简单的int
  • 这是非常基本的。它们是两种不同的类型,就这么简单。你在用哪本 C++ 书?
  • @user1511417:首先,那不是一本书。其次,它糟糕。它包含各种错误和误解。 stackoverflow.com/questions/388242/…
  • @LightnessRacesinOrbit:我恳请您再看看 cplusplus.com。我并不是说它没有错误,但他们最近做了很多改进。例如,this thread 中的许多(如果不是全部)投诉不再适用。

标签: c++ function reference argument-passing


【解决方案1】:

从技术上讲,第二个 可以 更快,因为第一个受别名影响 - 无法判断 pInt 是否未在函数之外修改。仅仅因为pInt 在方法中是const,并不意味着作为参数传递的原始变量必须是const - 请记住非constconst 的转换是隐式的。

如果编译器支持,此问题的解决方法是使用_restrict。请注意,这是固有的,而不是语言的一部分。

但在大多数情况下,它们是相同的。 个人资料个人资料。编写代码以提高可读性,并且仅在您认为值得时才进行这些小优化。

这适用于int - 如果您要传递一个大型结构,如果无法将复制省略应用于该特定情况,则按值传递可能会成为瓶颈。所以传递指针会更快,但我还是会使用引用。

【讨论】:

  • 你的回答让我更加困惑。我在这里使用了“const”,因为我希望指针表现得像普通的 int(秒示例),这意味着在两个示例中 pInt 都不能在函数内部更改!
  • @user1511417 在函数内部,没有。但是在外部,在多线程环境中呢?
  • @user1511417 你在这里有一些基本的困惑。在const int *pInt 的情况下,您使用与调用者相同的变量。在int pInt 的情况下,您将获得调用者值的副本。使用指针可能比制作副本更快,但仅适用于明显更大的类型,而不是简单的int's。
  • @LightnessRacesinOrbit 我的措辞不佳。我知道指针的值(它指向的地址)被复制了。我的意思是,在前一种情况下,您最终会在被调用方和调用方中访问相同的指向int,而在后一种情况下,被调用方将拥有int 参数的本地副本。
  • @user1511417:你认为你是那个意思,但实际上你不是那个意思。因为你说“我只想在这里传递值。”。这清楚地表明您确实关心值是否在函数之外发生变化,只是您没有意识到这一点,因为您不理解 Luchian 在说什么。所以让我重新表述一下。您是否同意 int 的值可能会在 您的函数运行时发生变化?因为如果你使用指针就会发生这种情况,甚至如果你使用 const.
【解决方案2】:

取决于你对函数内的参数做什么。如果您非常频繁地取消引用指针,那么您是间接的,并且会比您将值作为变量传递更多的工作。

您是否认为这种选择会导致您的应用程序的性能折衷?你在你的函数实现中做了什么,为什么你认为一个可能比另一个更快?

【讨论】:

    【解决方案3】:

    这两个例子 pInt 都不能在函数内部改变!

    然后你忘记了第二个函数的常量。意识到您可以在第二个函数中根据需要更改 pInt 值,但是由于整个内容是作为值传递的,因此任何更改都不会影响其他任何内容。

    你不想这样做吗?

    无效测试(const int pInt)

    如果你这样做,你的函数就会有一个 const int(作为参数传递)。

    【讨论】:

    • 我知道两者都不能改!我没有问他们有什么共同点!
    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 2011-02-13
    • 2017-01-30
    相关资源
    最近更新 更多