Храните объекты в сберегательной кассе
Пусть у нас есть некий тип, объекты которого создавать дороже, чем копировать. Пусть у нас есть функция, возвращающая объекты этого типа, причем часто эти объекты сконструированы из константных данных (очевидный пример: запись числа прописью). В этом случае более эффективно пользоваться статическими объектами для этих константных данных:
#include <string>
#include <iostream>
#define RET(x) // см. ниже
using namespace std;
string spellout_int(unsigned val) {
// детали додумайте сами
...
switch (val) {
...
case 5: return RET("five");
case 4: return RET("four");
case 3: return RET("three");
case 2: return RET("two");
case 1: return RET("one");
case 0: return string();
}
}
string spellout(unsigned val) {
return val ? spellout_int(val) : RET("zero");
}
int main() {
for (unsigned i = 0; i < 10000000; ++i)
cout << spellout(i) << '\n';
}Когда
RET(x) определено как x, программа, скомпилированная g++ 4.7.2 -O3, работает N секунд. Когда RET(x) определено как ({static string ret(x); ret;}) - а эта конструкция, если кто не в курсе, GNU extension, она работает примерно 0.83*N секунд. А теперь вопрос: как на этом вашем стандартном С++ написать то же самое, не засоряя код явными объявлениями статических переменных?