c++ - 为什么编译器不能优化这个 std::string 构造?
问题描述
考虑以下代码:
#include <string>
#include <cstring>
size_t foo(const char* cptr)
{
if (cptr == nullptr) { return 0; }
return strlen(cptr);
}
size_t bar()
{
static const char* cptr { "Hello world" };
return std::string{cptr}.length();
}
size_t baz(const char* cptr)
{
if (cptr == nullptr) { return 0; }
return std::string{cptr}.length();
}
使用 GodBolt,我们可以看到GCC 8.1 和 Clang++ 6.0 可以优化std::string
in 两者bar()
,但不能优化baz()
. 在baz()
中,虽然编译器不能返回固定值,但它绝对可以只运行检查字符串长度的代码,而不构造任何东西,或者至少不完成构造 - 即行为类似于foo()
. 为什么它完全构造字符串?
解决方案
在baz
编译器中不知道cptr
指向什么,所以它必须构造一个字符串来获取它的大小。
在bar
编译器中知道cptr
指向什么,"Hello world"
因此它可以用字符串size
的大小替换字符串的创建和调用。
推荐阅读
- python - 为什么在导入 csv 文件时使用 infer_datetime_format?
- spring-mvc - 原因:java.lang.IllegalStateException: 无法完成对 web application [] 注释的扫描,由 stackoverflow 引起
- python - 在 python 中使用 seaborn 绘图复制绘图
- php - SetHandler "proxy:unix:/run/php/php5.6-fpm.sock|fcgi://localhost/" ON
- php - TYPO3 模型验证
- excel - 在 NumberFormat vba 之后更新单元格
- javascript - 带有 charCodeAt() 的 js 中的 ASCII 字符
- malloc - Cython:在类中使用 PyMem_Malloc 时出现段错误
- python - Python不会读取文本文件
- java - 可以设计什么样的标准来优先考虑cloudsim中的cloudlet?