【问题标题】:Why doesn't GCC force parameters in __attribute__((pure)) functions to be const?为什么 GCC 不强制 __attribute__((pure)) 函数中的参数为 const?
【发布时间】:2011-01-27 03:28:22
【问题描述】:

以下代码在 GCC 4.2 下编译时没有警告,据我所知,它确实不应该:

#include <fstream>

__attribute__((pure))
double UnpureFunction(double* x) {
  x[0] = 42;
  return 43;
}

int main () {
  double x[] = {0};
  double y = UnpureFunction(x);
  printf("%.2f %.2f\n", x[0], y);
}

(它打印“42.00 43.00”。)

据我了解,纯属性告诉编译器该函数没有外部影响(请参阅“纯”部分here)。但是 UnpureFunction 正在修改它的参数。为什么允许这种情况发生?至少,编译器可以自动将每个参数设为 const。

【问题讨论】:

    标签: c++ attributes


    【解决方案1】:

    据我所知,pure对编译器的承诺,但它不会尝试验证你没有说谎。 即使它确实强制参数为const,这些参数也可能是谎言(例如,一个对象可能有一个可变成员,当你的代码调用成员函数时它会被修改)。

    如果您正在寻找 const 正确性,请使用 const 参数。 pureconst 属性用于提供可用于优化的提示。

    【讨论】:

    • 这太荒谬了。如果没有办法强制执行,那么拥有一个属性有什么意义?我自己试图找到一种方法来告诉 gcc 一个函数不允许访问它的参数之外的任何变量,但到目前为止,如果这个规则被打破,我还没有找到一种中止编译的方法。你会想象这在 2019 年将成为标准......
    【解决方案2】:

    首先,如果函数正在转发其参数的 const/non-const,那么该函数仍然可以是纯的,稍后的一些函数会对其进行修改。也就是说,非常量引用并不规定函数会专门修改它,而是非常量引用授予访问权限,使某些操作在链中向下,将修改状态(即产生副作用)。例如,如果我想编写一个返回整数向量的第一个元素的函数:

    int& first(std::vector<int>& v) __attribute__((pure))
    {
        return *(v.begin());
    }
    

    即使它可能需要非常量引用,我也可以将其声明为纯,因为first() 不会修改向量。相反,它只检索第一个元素(通常不会产生副作用)。稍后的一些操作可能会修改该值。从这个意义上说,它只是转发范围的 const/non-const。

    其次,即使参数是const,它仍然不能保证没有副作用,因为class可以声明字段为可修改,即使类是const,使用关键字@ 987654326@.

    【讨论】:

      【解决方案3】:

      啊,愚蠢的问题。 __attribute__((pure)) 结构允许程序员使用指针作为输出变量,这是标准的。我想这意味着我无法避免在变量前面使用大量样板常量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-20
        • 1970-01-01
        • 1970-01-01
        • 2019-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多