Comment écrire une constante littérale comme “size_t s = 16 MByte”?

Aujourd’hui, dans notre base de code, nous avons trouvé la ligne suivante et nous avons aimé son élégance pour écrire une taille de mémoire. Me demandais pendant quelques minutes comment cela se compilait.

size_t poolSize = 16 MByte; 

Une solution est donnée comme ma propre réponse. D’autres solutions?

En C ++ moderne, vous devez définir une notation littérale , par exemple

 auto operator""_MB( unsigned long long const x ) -> long { return 1024L*1024L*x; } 

Puis écrire

 long const poolSize = 16_MB; 

N’utilisez pas de macros, elles sont Evil ™ . À bien des égards.


Disclaimer: code non touché par les mains du compilateur.

Bien sûr, vous devriez utiliser la métaprogrammation de modèles pour ce problème:

 #include  #include  template struct is_power_of { static constexpr bool value = (N%M != 0)? false : is_power_of::value; }; template struct is_power_of<0, M> : public std::false_type { }; template struct is_power_of<1, M> : public std::true_type { }; template::value>::type> struct bytes { enum {value = N, next = value * 1024}; template struct comstack_time_get { enum {value = N*M}; }; static long long run_time_get(long long x) {return N*x;} }; typedef bytes<1> byte; typedef bytes kilo_byte; typedef bytes mega_byte; typedef bytes giga_byte; typedef bytes tera_byte; typedef bytes peta_byte; typedef bytes eksa_byte; int main() { std::cout << kilo_byte::compile_time_get<3>::value << std::endl; int input = 5; std::cout << mega_byte::run_time_get(input) << std::endl; } 

Sortie:

 3072 5242880 

VIVRE

Si vous allez le faire beaucoup, un littéral défini par l’utilisateur est la voie à suivre. OTOH, pour les one-off (et pour supporter les compilateurs plus anciens et autres langues), j’irais avec le direct:

 size_t poolSize = 16ul*1024*1024; 

C’était une utilisation simple et intelligente des bonnes vieilles macros.

 #define KByte *1024 #define MByte *1024*1024 #define GByte *1024*1024*1024 

So size_t poolSize = 16 MByte; se traduit en

 size_t poolSize = 16 *1024*1024; 

Tous les exemples que j’ai vus ressemblaient plus à

 #define KB 1024 #define MB (1024*1024) size_t poolSize = 16*MB; 

Pas de magie, pas de questions, ça marche.