具有内存大小定义的标头

Tor*_*ius 3 c c++ size header-files c-preprocessor

是否有标准的C/C++标头,其定义为byte,kilobyte,megabyte,......?我不想做自己的定义.在我看来这很脏.

例:

if (size > MEGABYTE)
{ ... }
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 14

不,没有这样的标准定义.可能是因为附加值非常小.

你经常看到这样的事情:

#define KB(x)   ((size_t) (x) << 10)
#define MB(x)   ((size_t) (x) << 20)
Run Code Online (Sandbox Code Playgroud)

这使用左移表示与x*1,024 相同的操作x*2 10,并且对于2 20表示相同,即1,024*1,024,即1,048,576.这"利用"了千字节,兆字节等的经典定义在计算中使用两个幂的事实.

演员size_t是好的,因为这些是大小,我们希望它们可以作为例如的参数使用malloc().

使用上面的代码,在代码中使用它们变得非常实用:

unsigned char big_buffer[MB(1)];
Run Code Online (Sandbox Code Playgroud)

或if(statbuf.st_size> = KB(8)){printf("file is 8 KB(或更大)\n"); }

但你当然可以用它们来进一步定义:

#define MEGABYTE MB(1)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这是兆字节到字节。如果你想要字节到兆字节,你可以执行“x &gt;&gt; 20” (2认同)

You*_*You 10

正如其他答案指出的那样,没有。C ++ 11中一个不错的解决方案是使用用户定义的文字:

constexpr std::size_t operator""_kB(unsigned long long v) {
  return 1024u * v;
}

std::size_t some_size = 15_kB;
Run Code Online (Sandbox Code Playgroud)

  • 更好的是,我喜欢将其与 std::chrono 使用的 C++ 比率模板相结合的想法。这样,所有“大小”单位都有自己的类型,并在它们之间进行隐式转换。 (2认同)