今天在我们的代码库中发现了以下行并且喜欢它的优雅来编写内存大小.想知道这是如何编译的几分钟.
size_t poolSize = 16 MByte;
Run Code Online (Sandbox Code Playgroud)
一个解决方案是我自己的答案.还有其他方法吗?
Che*_*Alf 85
在现代C++中,您应该定义一个文字符号,例如
auto operator""_MB( unsigned long long const x )
    -> long
{ return 1024L*1024L*x; }
Run Code Online (Sandbox Code Playgroud)
然后写
long const poolSize = 16_MB;
Run Code Online (Sandbox Code Playgroud)
不要使用宏,它们是Evil™.在很多方面.
免责声明:编译器未触及的代码.
xin*_*aiz 11
当然你应该使用模板元编程来解决这个问题:
#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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
3072
5242880
Run Code Online (Sandbox Code Playgroud)
        如果你要做很多事情,那么用户定义的文字是要走的路.OTOH,对于一次性(并支持较旧的编译器和其他语言),我会直接使用:
size_t poolSize = 16ul*1024*1024;
Run Code Online (Sandbox Code Playgroud)
        这是一个简单而巧妙地使用好的旧宏.
#define KByte *1024
#define MByte *1024*1024
#define GByte *1024*1024*1024
Run Code Online (Sandbox Code Playgroud)
所以size_t poolSize = 16 MByte;被翻译成
size_t poolSize = 16 *1024*1024;
Run Code Online (Sandbox Code Playgroud)