Le API istanziate sono un problema in un'interfaccia C?

2

Quindi un'API Instanced è una che si comporta come un oggetto. Quindi per esempio:

foo* GetInstancedAPI();
void MemFuncSetter(foo* fooThis, const int arg);
int MemFuncGetter(const foo* fooThis) const;

Questo è in contrasto con una API non istanziata che dipenderebbe dalle ricerche:

int GetInstancedAPI();
void MemFuncSetter(const int index, const int arg);
int MemFuncGetter(const int index) const;

Un piccolo background sulla situazione, questa è un'API C, che viene utilizzata per avvolgere un'implementazione C ++. Quindi internamente all'implementazione sto lavorando con gli oggetti. Quindi ho cercato di riflettere sulle ramificazioni di ciascuno, i problemi più importanti che posso pensare sono:

  • Come gestirò i callback?
  • C'è un modo per ridurre al minimo il costo di ricerca?

Modifica
Ci sono state molte richieste di chiarimenti: foo* è in realtà un puntatore void nell'interfaccia C che sarà reinterpret_cast in un puntatore all'oggetto C ++ attuale, quindi deve essere passato.

Le funzioni che prendono un int sono con l'intenzione di indicizzare in vector di oggetti nel C ++ avvolto.

    
posta Jonathan Mee 01.02.2018 - 14:51
fonte

3 risposte

8

Is there a way minimize the lookup cost?

Sì, non utilizzare una ricerca. Le API istanziate sono la strada da percorrere - chi non ha istanze soffre di problemi terribili come non avere accessi simultanei a più thread, dipendenze invisibili e altri problemi simili.

    
risposta data 01.02.2018 - 18:53
fonte
3

Non vedo alcuna differenza pratica tra l'esempio che hai fornito.

Nel primo caso hai restituito un puntatore a un oggetto. Nel secondo, hai restituito un indice di quell'oggetto in un array.

C definisce l'accesso dell'array e l'accesso al puntatore come essenzialmente equivalenti. %codice%. Quindi, in un caso, hai fatto un'aggiunta (e possibilmente in scala) prima di restituire il puntatore, mentre nell'altro li fai mentre accedi all'elemento.

In teoria, ciò può / dovrebbe favorire il puntatore (ogni leggermente), poiché fa l'aggiunta / ridimensionamento solo una volta invece di più volte. In realtà, non è necessariamente così semplice. Su un sistema moderno, un puntatore sarà spesso a 64 bit. Dal momento che non c'è praticamente alcuna possibilità che tu voglia realmente restituire elementi separati di 1.8x10 19 , puoi tipicamente usare un numero molto più piccolo per il tuo indice - un singolo carattere è spesso più che sufficiente. / p>

In questo caso, il caricamento e il passaggio di un char possono essere abbastanza veloci per compensare l'aggiunta e il ridimensionamento, quindi l'uso dell'indice risulta (leggermente) più veloce.

Per quanto riguarda l'accesso da più thread e così via ... dipende. È certamente vero che l'indice ha una dipendenza implicita dall'array in cui è indicizzato. Se passi l'indice oltre i limiti del thread, devi assicurarti che l'array sia accessibile da tutti i thread rilevanti (ma con la maggior parte dei sistemi, questo è l'impostazione predefinita e dovresti specificarlo esplicitamente per ottenere qualcosa di thread- Locale). Almeno nel codice normale, quell'array è di sola lettura, quindi non devi bloccarlo per ottenere l'accesso.

Potresti o forse non dovresti fare un blocco nell'oggetto stesso, ma è fondamentalmente irrilevante, perché usare un puntatore o un indice per trovare l'oggetto non influirà su come (o se) devi fare il blocco all'interno dell'oggetto.

    
risposta data 01.02.2018 - 23:44
fonte
2

I callback vengono gestiti nello stesso modo in cui ogni callback deve essere gestito in C, un puntatore a funzione e un puntatore void * userdate / context. Il puntatore della funzione accetta i parametri necessari e il puntatore del contesto che può quindi utilizzare per accedere allo stato di cui ha bisogno.

Il costo di ricerca è solo una ricerca extra di memoria rispetto all'utilizzo di globals per il tuo stato e non è diverso dall'uso delle funzioni membro C ++ che fanno la stessa cosa ( this viene passato come parametro nascosto).

    
risposta data 01.02.2018 - 18:18
fonte

Leggi altre domande sui tag