Внешние встроенные функции должны иметь одинаковый адрес во всех единицах перевода. Как, черт возьми, это достигается? - PullRequest
6 голосов
/ 18 октября 2011

Согласно стандарту, внешние встроенные функции должны иметь одинаковый адрес во всех единицах перевода.

Как это достигается в компиляторе?Я имею в виду, когда я собираю какой-то модуль перевода, я понятия не имею, на что будет похож другой TU.Так как я могу иметь один и тот же адрес везде?

Ответы [ 2 ]

6 голосов
/ 18 октября 2011

Это зависит от реализации, но обычно это разрешается компоновщиком.Каждый скомпилированный модуль перевода создаст объектный файл, содержащий копию функции, помеченной каким-либо образом, чтобы компоновщик знал, что он должен ожидать (и принимать) дубликаты.Компоновщик включит один из них, откажется от других и разрешит любые ссылки на функцию.

4 голосов
/ 18 октября 2011

Простая стратегия: каждый раз, когда определяется такая функция inline, компилируйте ее во время объекта, как если бы она была нормальной функцией.Затем во время соединения обнаружите дубликаты функций и удалите их, оставив по одной копии каждой.Именно так работали компиляторы C ++ (в том числе и с шаблонами) около 10 лет назад.Не уверен, как они это делают в наши дни.

...