相关疑难解决方法(0)

strlen()编译时优化

几天前我发现你可以strlen使用这样的东西找到编译时间:

template<size_t N>
constexpr size_t strlen_(const char (&data)[N]) noexcept{
    return N - 1;
}
Run Code Online (Sandbox Code Playgroud)

如果它被编译,那么一切都很好.你可以添加这样的重载:

size_t strlen_(const char *s) noexcept{
    return strlen(s);
}
Run Code Online (Sandbox Code Playgroud)

然后它将始终编译.

我的问题是 - C++是否<cstring>使用了这样的东西,如果没有 - 为什么?

c++ arrays string c++11

7
推荐指数
3
解决办法
2822
查看次数

gcc 何时在编译时评估函数?

当我有以下代码时

int main(void) {
        printf("%zd\n", strlen("Hello World!"));

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

并用 编译它-O3strings将显示字符串“Hello World!” 二进制文件中缺少它,因为它在编译时进行了评估。

如果我改为使用我自己的函数

static inline size_t my_strlen(const char *s) {
        const char *tmp = s;

        while (*++tmp);

        return tmp - s;
}

int main(void) {
        printf("%zd\n", my_strlen("Hello World!"));

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用相同的选项,仍然可以在二进制文件中找到该字符串。

为什么是这样?

c gcc

2
推荐指数
1
解决办法
1329
查看次数

标签 统计

arrays ×1

c ×1

c++ ×1

c++11 ×1

gcc ×1

string ×1