Я просматриваю AMD64 ABI, и он похоже, не указано, как передавать пустые типы классов. Для функций-членов пустого класса кажется, что this
передается как обычно, но для пустых классов Clang генерирует код, который просто игнорирует этот класс. Это правильно согласно AMD64 ABI?
Что происходит с пустыми классами в AMD64 ABI?
Ответы (1)
Хотя неясно, в чем именно заключается вопрос, ответ довольно ясен в отношении того, что такое C++ ABI:
Для C++ ABI мы будем использовать IA-64 C++ ABI и создадим его соответствующим образом. Текущий проект этого ABI доступен по адресу:
Ссылка на текущее местоположение спецификации Itanium ABI
Это говорит:
Пустые классы будут сдаваться не иначе, как обычные классы. При передаче в регистрах бит NaT не должен устанавливаться во всех регистрах, составляющих класс.
Содержимое однобайтового слота параметра не указано, и вызываемый объект может не зависеть ни от какого конкретного значения. В Itanium соответствующий бит NaT не должен быть установлен, если слот параметра связан с регистром.
Еще одна подсказка доступна здесь:
Результат пустого типа класса будет возвращен, как если бы это была структура, содержащая один символ, т. е. struct S { char c; };. Фактическое содержимое регистра возврата не указано. В Itanium соответствующий бит NaT не должен быть установлен.
Таким образом, пустой класс следует рассматривать как структуру, содержащую единственный символ, но этот единственный символ никогда не используется.
Конечно, возможно, что в clang
есть ошибка, связанная с пустыми классами. Хотя сомневаюсь, если честно.
Empty classes will be passed no differently from ordinary classes.
Не совсем уверен, что это именно тот контекст, о котором вы спрашиваете, но я бы сказал, что Clang ошибается... - person Andreas Fester   schedule 24.04.2013