Желание выяснить, что делать с производительностью и компиляцией. Если кто-то использует несколько вызовов для v.back()
вместо того, чтобы делать что-то вроде T = v.back()
, будет ли компилятор оптимизировать код и почему? Теоретически, кто-то может реализовать метод back()
, который является случайным. Есть ли что-то особенное в реализации спины, которая делает его быстрее?Насколько дороги вызовы метода back() вектора против хранения значения vs. вызов метода, который возвращает непредсказуемое значение?
-1
A
ответ
3
Результат v.back()
не будет кэшироваться, если компилятор не сможет увидеть его реализацию. Предполагая, что это вложен, компилятор может видеть, какие члены v
вносят вклад в возвращаемое значение v.back()
. Это, наверное, просто, что-то вроде begin+size-1
. Если ни одно из этих изменений не изменится, компиляторы поймут, что они могут выполнять стандартное исключение общего подвыражения в этом выражении.
«Теоретически, кто-то может реализовать обратный метод, который является случайным». Случайные? Нет, он довольно четко определен и должен работать в O (1). –
@MaxBozzi Да (я это знаю), я имею в виду, как компилятор «знал», что он всегда извлекает один и тот же элемент и оптимизирует для этого? Является ли компилятор интимным с языком? – zehelvion
Вы спрашиваете, как компилятор может кэшировать результат запроса 'v.back()'? Хотя мы предполагаем, что вектор изменчив, 'back' не является ссылочно прозрачным, поэтому это непросто проверить. Я не знаю деталей какого-либо конкретного оптимизатора компилятора, но некоторые могут отслеживать код для проверки. –