Какие компиляторы могут обнаружить чисто математические функции и оптимизировать их (не сообщая вам об этом)? - PullRequest
0 голосов
/ 27 июля 2010

Я видел, что GCC не может обнаруживать чисто математические функции, и ему нужно предоставить атрибут "const", чтобы указать, что .

Какие компиляторы могут обнаруживать чисто математические функциии оптимизировать их (не говоря вам об этом)?

Ответы [ 3 ]

2 голосов
/ 27 июля 2010

Делать это по-своему рискованно в тех языках, которые имеют указатели и в которых отсутствует глобальная компиляция и анализ.Таким образом, если операция объявлена ​​неконстантной, компилятор должен предположить, что она может иметь побочные эффекты.

Пример:

//getx.cpp
int GetX(int input)
{
   int* pData = (int*) input;
   *pData = 50;
   return 0;
}
// gety.cpp
int GetY(int input)
{
   return GetX(input + 4);
}
// main.cpp
int main()
{
   int arg[] { 0, 4 };
   return GetY((int)arg);
}

Компилятор при компиляции GetY не можетскажем, что GetX обрабатывает свой аргумент как указатель и разыменовывает и модифицирует данные нефункциональным образом, склонным к побочным эффектам.Эта информация доступна только во время компоновки, поэтому вам придется заново изобрести концепцию компоновки, включающую в себя большое количество генерации и анализа кода для поддержки такой функции.

0 голосов
/ 20 июня 2015

Кажется, что теперь gcc делает: выполняя "gcc -O2 -S" для следующего кода и читая сборку, вызов foo () из test () определяется как чистый и перемещается за пределы цикла:

#include <stdio.h>

double __attribute__((noinline)) foo(double x)
{
    x = x + 1;
    x = x * x;
    if (x > 20)
        x -= 1;
    x -= x * x;

    return x;
}

void test(int iters, double x)
{
    int i;
    for (i = 0; i < iters; ++i) {
        printf("%g\n", foo(x));
    }
}

Это Fedora 22, gcc 5.1.1, x86_64.Я не пробовал, но с -flto, я ожидал бы, что это сработает в разных единицах компиляции.

Также стоит отметить, что сегодня gcc имеет параметры командной строки -Wsuggest-attribute = pure и -Wsuggest= соп атрибута по.

0 голосов
/ 27 июля 2010

Это не совсем (afaik) компилятор , который делает это, но при написании C # в Visual Studio при использовании плагина ReSharper вы можете получить подсказки времени компиляции, которые указывают, что можно объявить что-то какconst.С другой стороны, это не относится к категории «без вашего ведома», поэтому это может быть не то, что вы ищете ...

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