Оператор + перегружен для примитивных типов? - PullRequest
5 голосов
/ 02 июня 2011

Уже перегруженные операторы <<, >>, = и т. Д. Используются много раз.

Пример, о котором я думал, - это когда мы добавляем строки, например:

имя строки= string ("munish") + "kumar";

оператор + перегружен в строковом классе.

но когда мы добавляем такие числа, как 1 + 2 (не похоже на перегруженный вызов оператора)

Мне просто интересно, как это происходит, если компилятор выполняет бинарное дополнение.

Мне не нужно сильно беспокоиться об этом, хотя, если компилятор делает это, просто вопрос любопытства для меня.

Ответы [ 3 ]

8 голосов
/ 02 июня 2011

Примитивные типы не реализуют operator+, что на самом деле является функцией со странным именем. Дополнение для типа Primitive выполняется инструкцией CPU, такой как:

addl %edx,(%eax) //this adds two integral values loaded at edx and eax

Вы реализуете operator+ для пользовательских типов, а компилятор генерирует множество инструкций ЦП для выполнения задачи, которую вы пишете в operator+.

2 голосов
/ 02 июня 2011

Я думаю, что вы путаете две вещи: перегрузку операторов и то, как вы определяете оператор для определенного пользователем типа.Перегрузка оператора не нова;он уже существует в C, где + перегружен на int, unsigned int, long, unsigned long, float, double и long double.В C ++ вы можете добавить операторы для пользовательских типов, определив функцию с именем operator+, чтобы список перегрузок был длиннее.И чтобы сделать вещи более связными, способ, которым компилятор разрешает перегрузку, состоит в том, чтобы добавить синтезированные сигнатуры по линиям operator+(int, int) в список перегрузок.Если затем разрешение перегрузки заканчивается выбором одной из этих синтезированных сигнатур, он использует встроенный оператор, генерирующий любой необходимый машинный код (который может включать вызов функции на уровне машинного кода).Тот факт, что он выбирает одну из «встроенных» перегрузок, имеет последствия в остальной части кода: пользовательский оператор считается вызовом функции с соответствующими точками последовательности и всеми остальными, а компилятор неразрешено делать любые предположения относительно его семантики - в частности, компилятор не может предполагать, что пользовательский operator+ является ассоциативным или коммутативным.Встроенный оператор (с очень немногими исключениями) не вводит никаких точек последовательности, и компилятор знает его семантику и может оптимизировать его в результате.

Обратите внимание, что сгенерированный машинный код может не быть таким разным.Я использовал машины, где компилятору приходилось вызывать функцию для умножения int s, и компилятор может (и часто будет) вставлять определенный пользователем оператор.Что изменило, так это правила, о которых я упоминал выше: наличие точек последовательности в пользовательских операторах и тот факт, что компилятор не может делать предположения относительно различных математических законов, которые могут применяться.

1 голос
/ 02 июня 2011

Вы можете перегрузить операторы на пользовательских типах данных, т.е. классах. Int является примитивным типом данных, а операторы на примитивных типах реализуются самим компилятором, в основном это просто простая инструкция CPU для добавления int и т. Д.

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