2010-05-31 19 views
9

Tengo una clase con número de miembros de datos privados (algunos de ellos estáticos), a la que acceden funciones de miembros virtuales y no virtuales. No hay funciones en línea y no hay clases de amigos.¿Cambia el orden de los miembros de datos privados de clase ABI

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 
}; 

¿Cambiar el orden de los miembros de datos privados rompe ABI en este caso?

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


Editar
Los tipos no se cambian, sólo el orden de los miembros. No se usan banderas de bits también. El código se usa como biblioteca compartida, no hay enlaces estáticos a este código. Estoy en Linux y los compiladores son gcc-3.4.3 y gcc-4.1

+1

Tenga en cuenta que en su caso, deberá declarar un constructor y un destructor, ya que ambos se proporcionan en línea. –

+1

@Johannes Sí, están declarados, solo los extrañé en la descripción. Pero gracias por la nota, es útil. –

Respuesta

12

Podría, sí, si no por otro motivo que el tamaño de A podría ser diferente debido a las diferencias en la ubicación y el número de rellenar bytes entre los miembros de datos.

3

C++ define no ABi. La única respuesta correcta aquí es "Depende de tu compilador". La respuesta es probablemente si.

+0

es gcc on linux –

3

Probablemente se rompa en cualquier lugar donde haya implementaciones compiladas en más de un binario, porque puede terminar con dos binarios con funciones que acceden a miembros privados ordenados de manera diferente. Esto incluye implementaciones de funciones virtuales, porque pueden tener sus implementaciones no anuladas compiladas en múltiples binarios también.

La mejor manera es usar las funciones virtuales pure y exponerlas como interfaces de un binario 'host'. Entonces los binarios adicionales no necesitan una implementación, por lo que siempre llaman a la implementación en el binario 'host', lo que significa que no hay espacio para la inconsistencia.

+0

Es una biblioteca compartida, supongo que se compila solo en un lugar y luego se usa en binarios que la cargan. Todavía 10 veces para la pista. –

5

De acuerdo con KDE Policies/Binary Compatibility Issues With C++ no puede hacerlo sin romper la compatibilidad binaria. Sin embargo, como dice su descargo de responsabilidad, algunos de los consejos que dan en la parte "no se puede ..." son dependientes del compilador, por lo que puede salirse con la suya con ese cambio (aunque no es muy probable).

+0

+1 por citar ese artículo de KDE Techbase. Sin duda es la mejor colección de consejos sobre compatibilidad ABI en la web. – andref

+0

@andref, duda de que sea el mejor; solo el más conocido, supongo ;-) –

Cuestiones relacionadas