2012-05-10 13 views
9

¿Cambiar el ABI al cambiar el orden de los métodos públicos no virtuales no sobrecargados en línea en una clase independiente?¿La reordenación de los métodos no virtuales públicos en una clase autónoma rompe ABI?

Antes:

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

Después:

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

Gracias!

+1

En teoría, la respuesta depende de la plataforma/cadena de herramientas que esté utilizando: C++ no exige un ABI específico. – Flexo

+4

Para aquellos como yo que no sabían lo que ABI significa: http://en.wikipedia.org/wiki/Application_binary_interface ¡Ahora sí! – Stormenet

Respuesta

8

Las funciones están vinculadas por su nombre y firma, no por su posición en la clase. Entonces no, no estás rompiendo el ABI.

Las funciones virtuales son una cuestión diferente porque están vinculadas por su posición en un vtable (generalmente). Esto no será un problema si recompila consistentemente cada archivo que depende del encabezado que define el orden, pero si la clase existe en una biblioteca podría ser una preocupación.

+0

Al menos: no es un problema en el Itanium ABI :) –

+0

No estaba seguro. ¡Gracias! –

1

Hay dos cosas que rompe el ABI cuando actualiza sus clases. Las funciones virtuales señaladas por Mark (y recuerde que no es porque no marcó una función como virtual que no).

La otra cosa son las funciones en línea porque utilizan sus miembros variables. Si el orden de sus miembros variables cambia, aquellos en línea compilados en otro software también se rompen.

+2

Dado que la pregunta no mencionaba el reordenamiento de las variables miembro, no lo consideré en mi respuesta, ¡muy buen punto! Ni siquiera tienen que ser públicos. También agradezco su recordatorio de que una clase base puede hacer que una función sea virtual, incluso si no está declarada en una clase derivada. –

Cuestiones relacionadas