Ser*_*i G 1 c++ memory optimization trim
我必须在C中编写快速右侧修剪功能.我的第一次尝试是:
void TrimRight( char *s )
{
char* pS;
if (!*s)
return;
if (!s)
return;
for ( pS = s + strlen(s) - 1; isspace(*pS) && (pS >= s); pS--)
{
pS[1] = '\0';
}
}
Run Code Online (Sandbox Code Playgroud)
第二次尝试:
void TrimRight( char *s )
{
if (!*s)
return;
if (!s)
return;
char* pS = s + strlen(s) - 1;
while ((*pS == ' ') && (pS > s))
{
(*pS--) = '\0';
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:我在这里改进了内存访问吗?我怎样才能进一步优化它?如何优化内存访问?
更新:按顺序递增的扫描内存是否更快?
我不打算在开始时考虑测试.应该是函数的一个要求,即传递一个有效的字符串,这样可以避免!s测试,并且!*s是多余的(此外,将!s测试放在第二个意味着你将首先崩溃!*s).此外,您可以strlen通过跟踪最后一个非空白字符来避免双向扫描(扫描单向扫描,while循环转向另一个方向):
char* TrimRight(char *s)
{
// ws tracks the char after the last non-whitespace char.
char* ws = s;
while (*s)
if (s++ != ' ') // or !isspace(s++)
ws = s;
*ws = '\0';
return ws; // Knowing where the trimming occurred might come in handy.
}
Run Code Online (Sandbox Code Playgroud)
编辑:请注意,strlen可能比扫描空格更快(请参阅注释).