Вопрос

Учитывая этот код, VC9 не обнаруживает сглаживание :

typedef struct { int x, y; } vec_t;

void rotate_cw(vec_t const *from,
               vec_t       *to)
{
        /* Notice x depends on y and vice versa */
        to->x = from->y;
        to->y = -from->x;
}

/* ... */
vec_t a, b;
rotate_cw(&a, &b); /* OK, no aliasing */
rotate_cw(&a, &a); /* FAIL, aliasing is not detected */

Очевидное решение заключается в использовании временного :

void rotate_cw(vec_t const *from,
               vec_t       *to)
{
        int temp = from->x;
        to->x = from->y;
        to->y = -temp;
}

Является ли это стандартным поведением ?Я ожидал, что компилятор, если ему об этом не будет сказано, предположит и то, и другое указатели, возможно, будут иметь псевдонимы.

Это было полезно?

Решение

Проверьте этот ответ.

Попробуйте положить __ ограничить перед параметрами, кажется, единственный найденный кем-либо способ заставить MSVC выдавать какие-либо предупреждения.

Другие советы

Код в том виде, в каком он написан, абсолютно корректен на C89 или C99.Это неясно, но компилятору нечего диагностировать, поэтому он не диагностирует.

Если бы вы использовали C99 и 'restrict' для обоих параметров функции, то вы бы получили сообщение об ошибке - если ваш компилятор поддерживает C99.AFAIK, ни одна текущая версия MSVC пока не поддерживает C99 полностью.

До того, как C99 изобрел restrict квалификатор, некоторые компиляторы C включали параметры оптимизации, которые позволяли бы им делать определенные предположения об использовании указателя;руководства, которые я видел для таких компиляторов, прямо предупреждали, что такие оптимизации были не соответствует стандартам и может произвольно приводить к тому, что код, использующий определенные конструкции, поведение которых было определено Стандартом, будет вести себя таким образом, который противоречит как Стандарту, так и намерениям программиста.С точки зрения руководства, оптимизация подсказала компилятору скомпилировать подмножество C, которое не определяло поведение определенных угловых случаев, определенных в C, но которое позволило бы генерировать более эффективный код для тех случаев, которые оно определило.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top