Почему GCC не заставляет параметры в функциях __attribute __ ((pure)) быть константными? - PullRequest
4 голосов
/ 27 января 2011

Следующий код компилируется без предупреждений в соответствии с 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».)

Насколько я понимаю, атрибут pure сообщает компилятору, что функция не имеет внешних эффектов (см. Раздел "pure" здесь ).Но UnpureFunction модифицирует свой параметр.Почему это может произойти?Как минимум, компилятор может автоматически сделать каждый параметр const.

Ответы [ 3 ]

10 голосов
/ 27 января 2011

Насколько я знаю, pure - это ваше обещание компилятору, но он не будет пытаться проверить, что вы не лжете. Даже если для параметров задано значение const, эти параметры могут быть ложными (например, объект может иметь изменяемый член, который изменяется, когда ваш код вызывает функцию-член).

Если вы ищете постоянную корректность, используйте const параметры. Атрибуты pure и const служат для предоставления подсказок, которые можно использовать для оптимизации.

1 голос
/ 14 января 2012

Во-первых, если функция пересылает const / non-const своих параметров, то функция все еще может быть чистой, и некоторая более поздняя функция изменит ее. То есть неконстантная ссылка не диктует, что функция определенно изменит ее, а скорее неконстантная ссылка предоставляет доступ, что какая-то операция, в цепочке, изменит состояние (то есть вызовет побочные эффекты). Например, если я хочу написать функцию, которая возвращает первый элемент вектора целых:

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

Я могу объявить его чистым, даже если он может принимать неконстантную ссылку, потому что first() не изменяет вектор. Вместо этого он извлекает только первый элемент (обычно это не вызывает побочных эффектов). Некоторые операции позже могут изменить значение. В этом смысле это только пересылка констант / неконстант диапазона.

Во-вторых, даже если параметры const, это по-прежнему не гарантирует отсутствие побочного эффекта, поскольку class может объявить поля изменяемыми, даже если класс равен const, используя ключевое слово mutable.

0 голосов
/ 27 января 2011

Ах, тупой вопрос.Конструкция __attribute __ ((pure)) позволяет программисту использовать указатели в качестве выходных переменных, как это стандартно.Я предполагаю, что это означает, что я не могу избежать большого количества шаблонов перед моими переменными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...