【发布时间】:2019-11-19 11:45:05
【问题描述】:
我正在开发一个程序,我们正在尽我们所能获得的每一点性能,我们现在进入微优化阶段(同时避免非严格必要的代码重复)。
想象一下这样的小代码:
propertyContent = gets_x_prop( propStruct );
propertyContent = ( propertyContent ? propertyContent : strdup("") );
/// ....
/// ....
/// ....
free(propertyContent)
已经做出决定,我们确信下一个要考虑攻击的是对空字符串的 strdup 的多次调用。
请记住,我们需要在该变量中添加一个 char* 以简化随后的代码并使其更直接(避免 (void*)0 出现错误)
问题在于如何优化...
到目前为止,我们只能实现一个自定义函数:
char* a = malloc(1);
a[0] = NULL;
我们认为应该有一些替代这种方法的方法。我们还不想用执行 NULL 检查的宏替换所有 free(),因为我们认为它对我们来说更难解决。
我们自己的测量结果表明,目前,等待时间最长的是在 malloc 中,例如发生在 strdup 中的那些,其中一些是复制空字符串。
【问题讨论】:
-
如果你有一个
propertyContent,它本身就是一个空字符串,你会想要释放它,除了你的静态之外你无法分辨它共享空字符串(除非您比较每个free之前的地址)。 -
您应该将
NULL视为指针常量,而不是字符常量。它可能只是整数0,但它可能被定义为(void*)0。无论如何,它与 ASCII NUL(一个 L)'\0'不是一回事。使用那个或0作为终止零字节。尤其是在“调用free之前”的上下文中,将其称为NULL 检查会令人困惑。我们只能从上下文中告诉您检查数据的意思,而不是指针。 -
free(NULL)非常安全。与其分配空字符串,不如分配 NULL。 -
“将所有 free() 替换为执行 NULL 检查的宏” - 为什么?
free(NULL)在标准 C 中得到完全支持,实际上是无操作的。 TL;DR : NULL 是“这里什么都没有”的一个很好的标记,因为它永远不会更真实。 -
I'm working on a program which we are squeezing every little bit of performance we can get and we are now into the micro-optimizations phase所以从 strdup 开始 :) 作为“宏”优化
标签: c micro-optimization