Заменяет ли C ++ встроенные операторы вызовами функций? - PullRequest
0 голосов
/ 18 декабря 2018

Я недавно читал о перегрузке операторов в C ++.Итак, мне было интересно, заменяются ли встроенные операторы вызовами функций за кулисами.

Например, заменены ли a + b (a и b типами int) на a.operator + (b)?Или компилятор делает что-то другое?

Ответы [ 3 ]

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

Внутренние компоненты компилятора сложны.На концептуальном уровне ответ - ДА.Всякий раз, когда компилятор видит a + b, он должен проверять известные функции с именем operator+ и заменять его вызовом нужной функции.

На практике это два важных нюанса:

  • Компилятор знает о фундаментальных типах (которые вы не можете переопределить), ему не нужно вставлять вызов функции, он может немедленно вставить правильные «инструкции»
  • Inliningважная оптимизация, которая уберет вызов функции, когда интересно
0 голосов
/ 18 декабря 2018

Может быть.Многие арифметические операции отображают dir calypso в инструкции процессора, и компилятор просто генерирует соответствующий код на месте.Если это невозможно, компилятор сгенерирует вызов соответствующей функции, и у библиотеки времени выполнения будет определение этой функции.В старину математика с плавающей точкой обычно выполнялась с помощью вызовов функций.В наши дни центральные процессоры для настольных систем оснащены оборудованием с плавающей запятой, а математика с плавающей запятой генерируется как прямые инструкции процессора.Но встроенные системы часто не имеют аппаратного обеспечения для этого, поэтому компилятор генерирует вызовы функций.

В самом начале даже целочисленная математика иногда делалась с вызовами функций.Из-за него IBM 1620 иногда называли CADET: не могу добавить, даже не попробовать.

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

Нет int::operator+.Независимо от того, решит ли компилятор компилировать a + b непосредственно в сборку (вероятно) или заменить его какой-либо внутренней функцией, такой как int __add_ints(int, int) (вряд ли), это деталь реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...