2012-05-10 10 views
9

Cambiare l'ordine di metodi non sovraccarichi non virtuali pubblici in una classe autonoma interrompe l'ABI?Il riordino dei metodi pubblici non virtuali in un ABI di interruzione di classe autonomo?

Prima:

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

Dopo:

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

Grazie!

+1

In teoria la risposta dipende da quale piattaforma/toolchain si sta utilizzando - C++ non richiede alcun ABI specifico. – Flexo

+4

Per quelli come me che non sapevano cosa significa ABI: http://en.wikipedia.org/wiki/Application_binary_interface Ora lo fai! – Stormenet

risposta

8

Le funzioni sono collegate dal nome e dalla firma, non dalla loro posizione nella classe. Quindi no, non stai infrangendo l'ABI.

Le funzioni virtuali sono una questione diversa perché sono collegate dalla loro posizione in un vtable (di solito). Questo non sarà un problema se ricompilate costantemente ogni file che dipende dall'intestazione che definisce l'ordine, ma se la classe esiste in una libreria potrebbe essere una preoccupazione.

+0

Almeno: non è un problema nell'IBI di Itanium :) –

+0

Non ero sicuro. Grazie! –

1

Ci sono due cose che interrompono l'ABI quando si aggiornano le classi. Funzioni virtuali come indicato da Mark (e ricorda che non è perché non hai contrassegnato una funzione come virtuale che non lo è.)

L'altra cosa sono funzioni inline perché quelle fanno uso dei membri variabili. Se l'ordine dei membri della variabile cambia, anche quelli in linea che sono stati compilati in altri software si interrompono.

+2

Poiché la domanda non ha menzionato il riordino delle variabili dei membri, non l'ho considerato nella mia risposta, ottimo punto! Non hanno nemmeno bisogno di essere pubblici. Apprezzo anche il tuo promemoria che una classe base può rendere una funzione virtuale anche se non è dichiarata così in una classe derivata. –