c++ - 接受指针参数的 GCC 纯/常量函数

标签 c++ c pointers gcc

如果一个函数有一个指针参数,是否(以及为什么)可以归结为 pureconst 的函数。

根据GCC documentation :

Some of common examples of pure functions are strlen or memcmp.

纯函数的全部意义在于它只需要为相同的参数调用一次,即如果编译器认为它适合这样做,结果可以被缓存,但是这对于 memcmp 是如何工作的?

例如:

char *x = calloc(1, 8);
char *y = calloc(1, 8);

if (memcmp(x, y, 8) > 0)
    printf("x > y\n");

x[1] = 'a';
if (memcmp(x, y, 8) > 0)
    printf("x > y\n");

第二次调用memcmp的参数与第一次相同(指针指向同一个地址),如果memcmp,编译器怎么知道不使用第一次调用的结果是纯的吗?

在我的例子中,我想将一个数组传递给一个纯函数,并仅根据数组计算结果。有人向我保证,这没关系,当数组中的值发生变化但地址没有变化时,我的函数将被正确调用。

最佳答案

如果我正确理解了文档,pure 函数可以依赖于内存的值,编译器知道内存何时发生变化。而且,一个函数不能改变程序的状态,比如一个全局变量,它只会产生一个返回值。

在您的示例代码中,memcmp 可以是 pure 函数。编译器看到在调用 memcmp 之间内存发生了变化,并且无法将第一次调用的结果用于第二次调用。

另一方面,memcmp 可以被声明为 const 函数,因为它依赖于内存中的数据。 如果是 const,编译器可以应用更积极的优化。

因此,将要实现的函数声明为 pure(但不是 const)似乎是安全的。

关于c++ - 接受指针参数的 GCC 纯/常量函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31306805/

相关文章:

c - 写入大量信息时 fprintf 出现问题

arrays - 无效操作 : index of type *int golang

C++ 模板给出未解析的函数类型

c++ - 预处理器/条件变量定义

c++ - 使用宏定义字段,但字段不能具有类型 'void' 和/或预期 ')'

c - 将秒和纳秒转换为微秒的最快(最佳时间)方式

c++ - nCk 模 p 当 n % p 或 k % p == 0

c - 在结构中匹配和搜索并标记 true 或 false C

c - 带有链表的无限循环

c - C中的结构体数组