【问题标题】:Direct invocation vs indirect invocation in CC中的直接调用与间接调用
【发布时间】:2011-02-04 05:47:13
【问题描述】:

我是 C 新手,我正在阅读指针如何“指向”另一个变量的地址。所以我尝试了间接调用和直接调用,并收到了相同的结果(正如任何 C/C++ 开发人员所预测的那样)。这就是我所做的:

int cost;
int *cost_ptr;

int main()
{
    cost_ptr = &cost;                          //assign pointer to cost
    cost = 100;                                //intialize cost with a value
    printf("\nDirect Access: %d", cost);
    cost = 0;                                  //reset the value
    *cost_ptr = 100;
    printf("\nIndirect Access: %d", *cost_ptr);
    //some code here

    return 0;                                  //1
}

所以我想知道使用指针的间接调用是否比直接调用有任何优势,反之亦然? 一些优势/劣势可能包括速度、执行操作所消耗的内存量(很可能相同)但我只是想把它放在那里)、安全性(如悬空指针)、良好的编程习惯等。
1有趣的是,我正在使用 GNU C 编译器 (gcc) 和它仍然可以在没有 return 语句的情况下进行编译,并且一切都按预期进行。可能是因为如果你忘记了,C++ 编译器会自动插入 return 语句。

【问题讨论】:

  • 问题是......?
  • “所以我想知道使用指针的间接调用是否比直接调用有任何优势,反之亦然。”
  • 我给它加了一个实际的问号..
  • 指针不是魔术。如果您了解使用指针时发生的情况,您应该能够回答自己的问题。
  • 顺便说一句——“调用”与“访问”不同。前者适用于调用代码,后者适用于任何用途。在这种情况下,您可能想要“访问”。

标签: c pointers comparison invocation indirection


【解决方案1】:

间接调用和直接调用用在不同的地方。在您的示例中,首选直接调用。使用指针的一些原因:

  • 将大型数据结构传递给函数时,可以传递指针而不是复制整个数据结构。
  • 当您希望函数能够修改调用函数中的变量时,您必须将指针传递给原始变量。如果你按值传递它,被调用的函数只会修改一个副本。
  • 当您在编译时不确定要传递哪个值时,可以在运行时设置一个指向正确值的指针。
  • 动态分配内存块时,您必须使用指针,因为在运行时才知道存储位置。

【讨论】:

    【解决方案2】:

    指针表示法涉及两次内存读取(或一次读取和一次写入),而直接调用涉及一次。

    由于内存访问很慢(与寄存器中的计算相比;与磁盘上的访问相比快),因此指针访问会减慢速度。

    但是,有时只有指针可以让您做您需要做的事情。不要纠结于差异,确实在需要时使用指针。但在不需要时避免使用指针。

    【讨论】:

      【解决方案3】:

      在“printf(..., *cost)”的情况下,“cost”的值被复制到堆栈中。虽然在这种情况下微不足道,但想象一下,如果您正在调用不同的函数并且“cost_ptr”指向一个数兆字节的数据结构。

      【讨论】:

      • C 中没有“堆栈”,以等效的存储时间来引用这些术语,即在这种情况下是自动的。
      猜你喜欢
      • 2017-07-17
      • 2021-09-26
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      相关资源
      最近更新 更多