Влияет ли изменение порядка членов личных данных класса на ABI - PullRequest
9 голосов
/ 31 мая 2010

У меня есть класс с количеством закрытых членов данных (некоторые из них статические), доступ к которым осуществляется с помощью виртуальных и не виртуальных функций-членов. Здесь нет встроенных функций и классов-друзей.

class A
{
    int number;
    string str;
    static const int static_const_number;
    bool b;
public:
    A();
    virtual ~A();
public:
    // got virtual and non-virtual functions, working with these memebers
    virtual void func1();
    void func2();

    // no inline functions or friends
};

В этом случае изменение порядка элементов личных данных нарушает ABI?

class A
{
    string str;
    static const int static_const_number;
    int number; // <--   integer member moved here
    bool b;
    ...
};


Редактировать
Типы не изменены, только порядок членов. Битовые флаги также не используются. Код используется в качестве разделяемой библиотеки, статическая ссылка на этот код отсутствует. У меня Linux и компиляторы gcc-3.4.3 и gcc-4.1

Ответы [ 4 ]

12 голосов
/ 31 мая 2010

Да, если по какой-либо иной причине размер A может отличаться из-за различий в расположении и количестве заполненных байтов между элементами данных.

5 голосов
/ 31 мая 2010

Согласно Политики KDE / Проблемы двоичной совместимости С C ++ вы не сможете сделать это, не нарушив двоичную совместимость. Однако, как говорится в их заявлении об ограничении ответственности, некоторые советы, которые они дают в части «вы не можете ...», зависят от компилятора, поэтому вам может сойти с рук это изменение (хотя это маловероятно).

3 голосов
/ 31 мая 2010

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

Лучший способ - использовать виртуальные функции pure и представлять их как интерфейсы из двоичного файла host. Тогда дополнительные двоичные файлы не нуждаются в реализации, поэтому они всегда вызывают реализацию в двоичном файле «host», что означает отсутствие места для несогласованности.

3 голосов
/ 31 мая 2010

C ++ не определяет ABi. Единственный правильный ответ здесь: «Это зависит от вашего компилятора». Ответ, вероятно, да.

...