В моем задании существует три причины для меня знать и использовать блок. В порядке важности:
Отладка - я часто получаю код библиотеки, который имеет ошибки или неполную документацию. Я выясняю то, что это делает путем вступания на уровне ассемблера. Я должен сделать это об один раз в неделю. Я также использую его в качестве инструмента для отладки проблем, в которых мои глаза не определяют идиоматическую ошибку в C/C ++/C#. Рассмотрение блока заканчивает это.
Оптимизация - который компилятор делает довольно хорошо в оптимизации, но я играю на другой приблизительной оценке, чем большинство. Я пишу код обработки изображений, который обычно запускается с кода, который похож на это:
for (int y=0; y < imageHeight; y++) {
for (int x=0; x < imageWidth; x++) {
// do something
}
}
"делают что-то, что часть" обычно происходит на порядке нескольких миллионов раз (т.е., между 3 и 30). Путем очистки циклов в тот "делают что-то" фаза, увеличение производительности чрезвычайно увеличено. Я обычно не запускаю там - я обычно запускаю путем написания кода, чтобы работать сначала, затем приложить все усилия для рефакторинга C, чтобы быть естественно лучше (лучший алгоритм, меньше загрузки в цикле и т.д.). Я обычно должен читать блок для наблюдения то, что продолжается и редко должно писать это. Я делаю это, возможно, каждые два или три месяца.
выполнение чего-то язык не позволит мне. Они включают - получение архитектуры процессора и определенных функций процессора, доступ к флагам не в ЦП (человек, мне действительно жаль, что C не предоставил Вам доступ к флагу переноса), и т.д. Я делаю это, возможно, один раз в год или два года.
Результат от операторов равенства (==
и !=
) дает определенные результаты, если указатели на объекты того же типа. Учитывая два указателя на один и тот же тип, верно только одно из следующего:
При одинаковых ограничениях (оба указателя относятся к одному и тому же типу объекта) результат от операторов упорядочения (<
, <=
, >
, >=
) указывается только в том случае, если оба они являются указателями на один и тот же объект или на отдельные объекты в одном и том же массиве (и для этой цели «кусок» памяти, выделенный с помощью malloc
, new
и т. д., квалифицируется как массив). Если указатели ссылаются на отдельные объекты, которые не являются частью одного и того же массива, результат не определен. Если один или оба указателя не были инициализированы, у вас неопределенное поведение.
Однако, несмотря на это, шаблоны сравнения в стандартной библиотеке (std::less
, std::greater
, std::less_equal
и std::greater_equal
) делают все дают значимый результат, даже когда / если встроенных операторов нет. В частности, они обязаны давать общий заказ. Таким образом, вы можете получить порядок, если хотите, но только не с помощью встроенных операторов сравнения (хотя, конечно, если один или оба указателя не инициализированы, поведение по-прежнему не определено).