Нарушает ли ABI изменение порядка общедоступных невиртуальных методов в автономном классе?

Нарушает ли ABI изменение порядка общедоступных невиртуальных не встроенных перегруженных методов в автономном классе?

До:

class MyFinalClass
{
public:
    // ...
    void doSomething(char c, int i, int n);
    void doSomething(char c, int i);
    // ...
};

После:

class MyFinalClass
{
public:
    // ...
    void doSomething(char c, int i);
    void doSomething(char c, int i, int n);
    // ...
};

Спасибо!


person Víctor Fernández    schedule 10.05.2012    source источник
comment
Теоретически ответ зависит от того, какую платформу/инструментарий вы используете — C++ не требует определенного ABI.   -  person Flexo    schedule 10.05.2012


Ответы (2)


Функции связаны по имени и сигнатуре, а не по положению в классе. Так что нет, вы не нарушаете ABI.

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

person Mark Ransom    schedule 10.05.2012
comment
По крайней мере: это не проблема в Itanium ABI :) - person Matthieu M.; 10.05.2012

Есть две вещи, которые ломают ABI, когда вы обновляете свои классы. Виртуальные функции, как указал Марк (и помните, что это не потому, что вы не отметили функцию как виртуальную, что это не так).

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

Как указал Рассел Грин (см. комментарий), порядок членов переменных также может вызывать различия в выравнивании, которых достаточно для изменения размера выделенных объектов. Это также нарушает ваше распределение (при условии, что код клиента использует new)

И добавление/удаление элементов может не нарушить ABI (вы все еще можете выделить байт здесь или слово там...), но обычно это сразу же нарушает условия сделки.

person Alexis Wilke    schedule 10.05.2012
comment
Поскольку в вопросе не упоминалось об изменении порядка переменных-членов, я не учел это в своем ответе, очень хороший момент! Они даже не должны быть публичными. Также я ценю ваше напоминание о том, что базовый класс может сделать функцию виртуальной, даже если она не объявлена ​​​​в производном классе. - person Mark Ransom; 10.05.2012
comment
Порядок переменных-членов на самом деле более важен, чем просто нарушение встроенных функций - он может изменить размер структуры (из-за выравнивания), что может привести к повреждению памяти. См. cpp.sh/4ynmj. - person Russell Greene; 30.07.2019