2015-06-12 7 views
5

Ho iniziato ad usare la libreria OpenCL ultimamente e ho notato che stanno usando i propri tipi interi, come cl_int e cl_uint invece di int e unsigned int.Perché le librerie C++ spesso definiscono i propri tipi primitivi?

Perché è quello? Perché non usano i tipi che sono di default nella lingua? È una buona pratica o ci sono ragioni pratiche per questo (codice più leggibile)?

+1

Principalmente per crossover x64/x86 o per definire condizioni specifiche. – Bastien

+0

https://en.wikipedia.org/wiki/Not_invented_here –

risposta

8

Il motivo per cui questo è stato fatto in passato è la portabilità. C e C++ non forniscono garanzie specifiche delle dimensioni di int, long e short, mentre i progettisti di librerie spesso lo richiedono.

Una soluzione comune è definire i propri alias per i tipi di dati e modificare le definizioni in base alla piattaforma specifica, assicurandosi che venga utilizzato il tipo di dimensione appropriata.

Questo problema ha origine in C ed è stato risolto introducendo il file di intestazione stdint.h (rinominato in cstdint in C++). Includendo questa intestazione è possibile dichiarare i tipi int32_t, int16_t, ecc. Tuttavia, le librerie sviluppate prima dell'introduzione di stdint.h e le librerie necessarie per la compilazione su piattaforme prive di questa intestazione utilizzano la soluzione alternativa precedente.

+0

Molto più chiaro ora, grazie. Potresti riferirmi ad un sito per un esempio specifico, come definiresti il ​​tuo intero tipo che è, diciamo, senza firma e lungo 16 bit? – Addy

+1

@Addy Questo è in genere fatto con la compilazione condizionale '# ifdef' e' typedef's in una delle intestazioni. Per OpenCL è [cl_platform.h] (https://www.khronos.org/registry/cl/api/1.1/cl_platform.h). Cerca il file per 'cl_uint' per vedere come viene definito in base alla piattaforma. – dasblinkenlight

3

Spesso è possibile configurare e propagare in tutto il codice configurazioni così diverse.

Per esempio so che Bullet 3 definisce btScalar, che (tra le altre cose) è fondamentalmente:

#if defined(BT_USE_DOUBLE_PRECISION) 
typedef double btScalar; 
#else 
typedef float btScalar; 
#endif 

Così in tutto il codice è possibile utilizzare btScalar invece di float o double, e tutte le istanze di che potrebbe essere commutato definendo o indefinendo quella macro.

Ci sono altri analoghi di questo che gestiscono width of integer types, different character sets e altri scenari dipendenti dalla piattaforma.

3

Definendo i propri tipi, è possibile fare affidamento sul fatto che questi tipi avranno sempre le stesse dimensioni.

I tipi possono variare da piattaforma a piattaforma e compilatore a compilatore. Sebbene l'STL fornisca <cstdint>, alcuni sviluppatori preferiscono le proprie definizioni perché non desiderano utilizzare l'STL.

La maggior parte delle volte si può supporre che int abbia una dimensione di 32 bit, ma può cambiare, ed è qui che alcuni sviluppatori preferiscono definire i propri tipi affidabili in base al caso in cui potrebbe non esserlo.