#c #optimization
Вопрос:
В случае, когда вам нужно проверить возвращаемое значение на сайте вызова, легко ли компилятору оптимизировать его, если значение проверяется в самой функции? Имеет ли значение, является ли функция встроенной? Я попытался просмотреть ассемблерный код, чтобы проверить наличие скачков, но, боюсь, я его совсем не понимаю. Я говорю о такой ситуации, как эта?
int* try_get()
{
static int anint;
anint = rand() % 2;
if (anint) return amp;anint;
else return nullptr;
}
int main()
{
int* p = try_get();
if (p) // The value was already tested in the function.
// Is optimisation of this easy? Does it depend on whether the function is inline?
{
std::cout << "Hello";
}
}
Комментарии:
1. Не совсем понимаю, о чем ты спрашиваешь. Функция может возвращать либо нулевой указатель, либо действительный адрес, в зависимости от результата вызова
rand
… как компилятор может знать, что эта функция вернет во время компиляции? Обратите внимание, что возвращаемое значение не было проверено в функции — его значение было определено этой функцией.2. Какая регистрация
try_get
должна позволитьif(p)
оптимизировать ее? Поtry_get
— прежнему возвращается либоnullptr
или нетnullptr
. Или вы спрашиваете , выполняет ли компилятор встраивание дляtry_get
, если бы он затем мог объединить эти дваif
?3. @t.niese Я имею в виду объединение двух ifs, он возвращает либо нулевой, либо действительный адрес, а затем на сайте вызова проверяет, является ли результат нулевым или нет, но это уже было решено филиалом в if (anint)
Ответ №1:
Компилятору C разрешается выполнять любую оптимизацию, не имеющую заметных эффектов, однако стандарт C не требует, чтобы какой-либо компилятор C выполнял такую оптимизацию (за исключением тех, которые требуются самой спецификацией C , например, обязательное копирование elision). За исключением требуемой оптимизации, все остальное полностью зависит от вашего компилятора C .
Если компилятор имеет доступ как к определению функции, так и к сайту ее вызова, и компилятор может определить, что эта конкретная оптимизация не имеет заметных эффектов, то компилятор, безусловно, может ее оптимизировать. Сделает ли это ваш компилятор, можно ответить, только посмотрев на скомпилированный код вашего компилятора. И даже после определения того, что на самом деле делает ваш компилятор, конечно, не будет иметь никакого отношения к тому, что сделал бы любой другой компилятор.
Независимо от того, является ли рассматриваемая функция встроенной или нет, может быть или не быть фактором, который ваш компилятор учитывает при принятии решения о выполнении этой оптимизации.
И, наконец, даже если посмотреть на то, что создал ваш компилятор для конкретной единицы перевода, это может даже не нарисовать всю картину целиком. Многие современные компиляторы C используют оптимизацию времени связи, когда объединенные могучие силы компилятора и компоновщика производят дополнительную оптимизацию и преобразования кода в конечном связанном исполняемом файле.
Таким образом, единственный окончательный ответ здесь-на самом деле взглянуть на фактический связанный код в вашем конечном исполняемом файле, чтобы выяснить, была ли проведена какая-либо конкретная оптимизация, и, конечно, это сугубо технический вопрос.
Комментарии:
1. Вы также можете упомянуть, что любые внесенные изменения (в код, цепочку инструментов и т. Д.) Во многих случаях приводят или отменяют любые наблюдаемые оптимизации.