C中的内存访问优化

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)

问题是:我在这里改进了内存访问吗?我怎样才能进一步优化它?如何优化内存访问?

更新:按顺序递增的扫描内存是否更快?

Mar*_*tos 7

我不打算在开始时考虑测试.应该是函数的一个要求,即传递一个有效的字符串,这样可以避免!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可能比扫描空格更快(请参阅注释).