Разрешены ли эти оптимизации компилятора из примера CppCon? - PullRequest
0 голосов
/ 21 декабря 2018

Я смотрю видео CppCon, которое показывает этот код:

void foo(const int&);

bool bar(int x)
{
    const int y = x + 1;
    foo(y);
    return y > x;
}

Прежде всего, говорящий говорит, что, поскольку функция foo () принимает 'y' по ссылке const, а 'y'на самом деле const int, то изменение значения в foo () является неопределенным поведением во время выполнения.И, кажется, говорит, что, поскольку это недопустимо, компилятор должен на самом деле предполагать, что «y» не изменяется в вызове foo (), и что функция bar () должна просто возвращать true, не делая сравнения.

Насколько мне известно, компилятору разрешено просто возвращать true, потому что foo () действительно недопустимо менять y.

Тогдаговорит "но это не так", как бы подразумевая, что это недостаток компилятора, который упустил оптимизацию.Прав ли он по этому поводу?

Кроме того, насчет предположения, что «у» всегда будет больше, чем «х», и поэтому функция должна просто возвращать истину, а не сравнивать их, разве нет значения, которое можетбыть передано в функцию, а именно максимальное значение, которое может содержать тип, где "y = x + 1" вызовет переполнение, означающее, что y> x больше не является истиной?Я полагаю, что это относится как к знаку, так и к знаку без знака.

Так что в этом примере есть целые числа со знаком, «у» равно «х» плюс 1, поэтому, если «у» не изменяетсятеперь он всегда больше, чем «х».Компилятору разрешено делать это предположение для подписанного, а не для беззнакового.

Он также говорит:

Если вы измените его на передачу по значению, то это сработает.

Как будто сказать, что инструкция сравнения пропала и функция просто возвращает true, но как компилятор может сделать это предположение, учитывая целочисленную точку переполнения?

Здесь является соответствующим пунктом в видео.

1 Ответ

0 голосов
/ 21 декабря 2018

Подписано int переполнение не определено, поэтому компилятору разрешено игнорировать вероятность того, что x + 1 может уменьшить x.

Компиляторы становятся все лучше и лучше при разработкестратегии оптимизации;вы можете ожидать, что ваша функция будет оптимизирована для вызова foo, а затем return true; в будущем.

...