如何写一个像“size_t s = 16 MByte”的字面常量?
今天在我们的代码库find了下面这行,并且喜欢它的优雅来写一个内存大小。 想知道这是如何编译的几分钟。
size_t poolSize = 16 MByte;
一个解决scheme是作为我自己的答案。 任何其他解决scheme
在现代的C ++中,你应该定义一个文字符号 ,例如
auto operator""_MB( unsigned long long const x ) -> long { return 1024L*1024L*x; }
然后写
long const poolSize = 16_MB;
不要使用macros,它们是Evil™ 。 在很多方面。
免责声明:代码没有被编译器的手感动。
当然,你应该使用模板元编程来解决这个问题:
#include <iostream> #include <type_traits> template<long long N, long long M> struct is_power_of { static constexpr bool value = (N%M != 0)? false : is_power_of<N/M, M>::value; }; template<long long M> struct is_power_of<0, M> : public std::false_type { }; template<long long M> struct is_power_of<1, M> : public std::true_type { }; template<long long N, typename = typename std::enable_if<is_power_of<N, 1024>::value>::type> struct bytes { enum {value = N, next = value * 1024}; template<long long M> struct compile_time_get { enum {value = N*M}; }; static long long run_time_get(long long x) {return N*x;} }; typedef bytes<1> byte; typedef bytes<byte::next> kilo_byte; typedef bytes<kilo_byte::next> mega_byte; typedef bytes<mega_byte::next> giga_byte; typedef bytes<giga_byte::next> tera_byte; typedef bytes<tera_byte::next> peta_byte; typedef bytes<peta_byte::next> 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; }
输出:
3072 5242880
生活
如果你要做很多事情,那么用户定义的文字就是要走的路。 OTOH,一次性(并支持较老的编译器和其他语言),我会去直接:
size_t poolSize = 16ul*1024*1024;
这是一个简单而巧妙的使用旧的macros。
#define KByte *1024 #define MByte *1024*1024 #define GByte *1024*1024*1024
所以size_t poolSize = 16 MByte;
被翻译成
size_t poolSize = 16 *1024*1024;
我看到的所有例子都更像
#define KB 1024 #define MB (1024*1024) size_t poolSize = 16*MB;
没有魔法,没有问题,只是工作。