假设我需要调用一个函数foo,该函数std::string从我的代码中的很多地方获取const 引用:
int foo(const std::string&);
..
foo("bar");
..
foo("baz");
Run Code Online (Sandbox Code Playgroud)
使用像这样的字符串文字调用函数将创建临时std::string对象,每次复制文字.
除非我弄错了,否则编译器不会通过为std::string每个文字创建一个可以重复用于后续调用的静态对象来优化它.我知道g ++有高级字符串池机制,但我不认为它扩展到std::string对象本身.
我自己可以做这个"优化",这使代码的可读性降低:
static std::string bar_string("bar");
foo(bar_string);
..
static std::string baz_string("baz");
foo(baz_string);
Run Code Online (Sandbox Code Playgroud)
使用Callgrind,我可以确认这确实加快了我的程序.
我以为我会尝试为此制作一个宏,但我不知道是否可能.我想要的是:
foo(STATIC_STRING("bar"));
..
foo(STATIC_STRING("baz"));
Run Code Online (Sandbox Code Playgroud)
我尝试使用文字作为模板参数创建模板,但事实证明这是不可能的.由于代码块中的函数定义是不可能的,我完全没有想法.
有没有一种优雅的方式来做到这一点,还是我不得不求助于那种不太可读的解决方案?
根据我的理解,mmap'适合RAM的文件就像将文件放在内存中一样.
假设我们有16G的RAM,我们首先mmap我们使用了一段时间的10G文件.这在访问方面应该相当有效.如果我们然后mmap第二个10G文件,那会导致第一个被换出吗?还是它的一部分?如果是这样,这会发生什么时候?在mmap调用,或访问新加载的文件的内存区域?
如果我们想再次访问第一个文件的指针内存,是否会使它再次加载交换文件?那么,假设我们在对应于第一个文件和第二个文件的内存之间交替读取,是否会导致灾难性的性能?
最后,如果这是真的,那么mmap几个较小的文件会更好吗?
我很惊讶地发现它ATOMIC_FLAG_INIT被描述为C++ 11标准中定义的预处理器宏.这是一个例外,还是新的C++标准真的涵盖了预处理器步骤?
对我来说,预处理器本身就是一种实用的语言,现在的趋势似乎是不鼓励使用它.