Is it unspecified behavior to compare pointers to different arrays for equality?

В моем задании существует три причины для меня знать и использовать блок. В порядке важности:

  1. Отладка - я часто получаю код библиотеки, который имеет ошибки или неполную документацию. Я выясняю то, что это делает путем вступания на уровне ассемблера. Я должен сделать это об один раз в неделю. Я также использую его в качестве инструмента для отладки проблем, в которых мои глаза не определяют идиоматическую ошибку в C/C ++/C#. Рассмотрение блока заканчивает это.

  2. Оптимизация - который компилятор делает довольно хорошо в оптимизации, но я играю на другой приблизительной оценке, чем большинство. Я пишу код обработки изображений, который обычно запускается с кода, который похож на это:

    for (int y=0; y < imageHeight; y++) {
        for (int x=0; x < imageWidth; x++) {
           // do something
        }
    }
    

    "делают что-то, что часть" обычно происходит на порядке нескольких миллионов раз (т.е., между 3 и 30). Путем очистки циклов в тот "делают что-то" фаза, увеличение производительности чрезвычайно увеличено. Я обычно не запускаю там - я обычно запускаю путем написания кода, чтобы работать сначала, затем приложить все усилия для рефакторинга C, чтобы быть естественно лучше (лучший алгоритм, меньше загрузки в цикле и т.д.). Я обычно должен читать блок для наблюдения то, что продолжается и редко должно писать это. Я делаю это, возможно, каждые два или три месяца.

  3. выполнение чего-то язык не позволит мне. Они включают - получение архитектуры процессора и определенных функций процессора, доступ к флагам не в ЦП (человек, мне действительно жаль, что C не предоставил Вам доступ к флагу переноса), и т.д. Я делаю это, возможно, один раз в год или два года.

16
задан Fred Nurk 5 February 2011 в 21:26
поделиться

1 ответ

Результат от операторов равенства (== и !=) дает определенные результаты, если указатели на объекты того же типа. Учитывая два указателя на один и тот же тип, верно только одно из следующего:

  1. оба являются нулевыми указателями, и они сравниваются равными друг другу.
  2. оба являются указателями на один и тот же объект, и они сравниваются равными друг другу.
  3. они являются указателями на разные объекты, и они сравниваются не равны друг другу.
  4. по крайней мере один не инициализирован, и результат сравнения не определен (и, фактически, само сравнение может никогда не произойти - просто попытка прочитать указатель, чтобы выполнить сравнение, дает неопределенное поведение).

При одинаковых ограничениях (оба указателя относятся к одному и тому же типу объекта) результат от операторов упорядочения (<, <=, >, >=) указывается только в том случае, если оба они являются указателями на один и тот же объект или на отдельные объекты в одном и том же массиве (и для этой цели «кусок» памяти, выделенный с помощью malloc, new и т. д., квалифицируется как массив). Если указатели ссылаются на отдельные объекты, которые не являются частью одного и того же массива, результат не определен. Если один или оба указателя не были инициализированы, у вас неопределенное поведение.

Однако, несмотря на это, шаблоны сравнения в стандартной библиотеке (std::less, std::greater, std::less_equal и std::greater_equal) делают все дают значимый результат, даже когда / если встроенных операторов нет. В частности, они обязаны давать общий заказ. Таким образом, вы можете получить порядок, если хотите, но только не с помощью встроенных операторов сравнения (хотя, конечно, если один или оба указателя не инициализированы, поведение по-прежнему не определено).

11
ответ дан 30 November 2019 в 17:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: