Я смотрю на AMD64 ABI и он не указывает, как передавать пустые типы классов. Для пустых функций-членов класса кажется, что this
передается как обычно, но для пустых классов Clang генерирует код, который просто игнорирует этот класс. Это правильно в соответствии с AMD64 ABI?
Пока неясно, в чем конкретно вопрос, ответ довольно ясен относительно того, что такое ABI C ++:
Для C ++ ABI мы будем использовать IA-64 C ++ ABI и создавать его экземпляры
соответственно. Текущий проект этого ABI доступен по адресу:
Ссылка на текущее местоположение спецификации Itanium ABI
Это говорит:
Пустые классы будут проходить не иначе, как обычные классы. Если
переданный в регистрах, бит NaT не должен быть установлен на всех регистрах, которые
составляют класс.Содержимое однобайтового слота параметра не определено, и
вызываемый может не зависеть от какой-либо конкретной ценности. На Itanium,
связанный бит NaT не должен быть установлен, если слот параметра связан
с регистром.
Другая подсказка доступна здесь:
Результат с пустым типом класса будет возвращен, как если бы он был
struct, содержащая один символ, то есть struct S {char c; } ;.
фактическое содержимое регистра возврата не указано. На Itanium,
связанный бит NaT не должен быть установлен.
Таким образом, пустой класс должен рассматриваться как структура, содержащая один символ, но этот символ никогда не используется.
Конечно, возможно, что есть ошибка в clang
Что касается пустых классов. Хотя я в этом сомневаюсь, если честно.
Других решений пока нет …