C 中使用引用与局部变量的效率

问题描述 投票:0回答:1

我在C中定义了一个函数,如下:

char **fun(size_t *size) {  
  size_t local_size = 0;
  while (...) {
    //Function code...
    local_size++;
  }
  *size = local_size;
  //Code for returning
}

如您所见,它有一个局部变量,用作计数器,然后通过将大小引用的值设置为局部大小的值来返回它。

此外,我还通过直接使用输入引用指向的值来实现该函数,如下所示:

char **fun(size_t *size) {  
  *size = 0;
  while (...) {
    //Function code...
    (*size)++;
  }
  //Code for returning
}

鉴于它们具有相同的行为,如果我知道函数内会对变量进行多次访问,哪个选项更有效?使用局部变量选项来利用堆栈内存分配是否更快?

c linux pointers memory
1个回答
1
投票

第一个

*size++
是错误的;增加
size
,而不是
*size
。您需要
(*size)++
++*size

如果

//Function code...
包含任何可能访问
size
指向的内容,则编译器无法通过缓存
*size
的副本进行优化:

  • 如果它使用可能以
    size_t
    为别名的对象的文件范围标识符,则
    size
    可能指向该对象。
  • 如果它调用编译器无法看到或知道其定义的任何其他函数,该函数可能会访问
    *size
  • 如果它从编译器不完全知道的地方获取字符指针并使用该字符指针修改内存,那么情况可能会改变
    *size
    ,因为允许字符类型访问任何对象。
  • 您的示例函数没有其他参数,但实际函数通常有多个参数,这会引发相同的问题,它们可能指向
    size
    指向的同一个对象。

因此,您最好使用该函数的第一个版本。

© www.soinside.com 2019 - 2024. All rights reserved.