通过“避免使用字符串”,我假设您这样做是因为如果您想要一个整数值,那么只使用字符串表示的效率非常低。
为此,我建议采取一种稍微非正统的方法
可以
要合适。不要以一种形式存储它们,将它们存储在
二者都
. 下面的代码是C-它将
工作
在C++中,但是你可能想考虑使用C++等价物——但是它背后的思想并没有改变。
通过“存储这两个表单”,我的意思是您可以具有如下结构:
typedef struct {
int ival;
char sval[sizeof("-2147483648")]; // enough for 32-bits
int dirtyS;
} tIntStr;
并传递此结构(或其地址),而不是整数本身。
通过使用宏或内联函数,如:
inline void intstrSetI (tIntStr *is, int ival) {
is->ival = i;
is->dirtyS = 1;
}
inline char *intstrGetS (tIntStr *is) {
if (is->dirtyS) {
sprintf (is->sval, "%d", is->ival);
is->dirtyS = 0;
}
return is->sval;
}
然后,要设置该值,您将使用:
tIntStr is;
intstrSetI (&is, 42);
当你想要字符串表示的时候:
printf ("%s\n" intstrGetS(&is));
fprintf (logFile, "%s\n" intstrGetS(&is));
这有一个优点,即只在需要时计算字符串表示形式(即
fprintf
上面不必重新计算字符串表示形式和
printf
只有当它脏的时候)。
这与我在SQL中使用预计算列和触发器时使用的技巧类似。这里的想法是,您只在需要时执行计算。因此,一个额外的列来保存索引的低位姓氏以及一个用于计算它的插入/更新触发器,通常比
select lower(non_lowercased_last_name)
. 这是因为它将计算成本(在写入时完成)分摊到所有读取中。
从这个意义上说,如果您的代码配置文件是
set-int/use-string/set-int/use-string...
. 但是,如果是的话
set-int/use-string/use-string/use-string/use-string...
,您将获得性能提升。
当然,这是有代价的,只需要最少的额外存储空间,但大多数性能问题归结为空间/时间的权衡。
如果你
真的?
为了避免字符串,您仍然可以使用相同的方法(仅在需要时才计算),只是计算(和结构)会有所不同。
作为旁白:
您很可能希望使用库函数来完成这项工作,而不是手工编写自己的代码。库函数通常会进行大量的优化,可能比编译器从代码中获得的优化还要多(当然,这并不能保证)。
也可能是
itoa
如果你有,可能会跑赢
sprintf("%d")
同时,考虑到其有限的用例。不过,你应该,
测量,而不是猜测!
不仅是在库函数方面,还包括整个解决方案(以及其他解决方案)。