c++ - 不存储字符串长度和其他此类值会使程序变慢吗?
问题描述
在这里,我有两个代码功能:
string func1(string s) {
for(int i=0;i<s.length();i++){
for(int j=i+1;j<=s.length();j++){
cout << i <<"\t"<<j<<endl;
}
}
return "test";
}
string func2(string s) {
int n = s.length();
for(int i=0;i<n;i++){
for(int j=i+1;j<=n;j++){
cout << i <<"\t"<<j<<endl;
}
}
return "test";
}
两者都做同样的事情。打印 i 和 j 组合的值。但我一直想知道,每次我们在代码中提到它时,不会将 s.length() 存储在像 n 触发重新计算这样的变量中。如果这是真的,那么 func2 应该比 func1 运行得更快。
还是 C++ 编译器和其他编程语言编译器有一些聪明的方法来检测这一点并确保在转换为机器语言时不会发生这种重新计算?
然后我有另一个问题,像 vector.size() 或 string.length() 这样的函数是否在恒定时间内分别给出大小和长度(通过在每次插入或删除发生时预先计算它,然后在调用时只提供值for in vector.size 或 string.length) 还是遍历整个数据结构以在每次调用该方法时计算它。
我知道所有这些都是非常基本的疑问,但我从未见过程序员谈论这个,我想确定一下。我在 C++ 方面的有限经验也无济于事。
解决方案
推荐阅读
- laravel - 在 laravel 中使用加密表字段的条件在哪里?
- networking - 我如何能够如此快速地检索 google.com 页面?
- python - 数据框列值及说明
- xml - 如何在项目的以下节点中找到不重复和不反转的值对?
- python - 如何在两个不同的 docker 容器中的两个 django 应用程序之间建立连接?
- javascript - Momentjs 将总周数转换为月份缩写 (javascript)
- html - Flexbox 在同一个 flexbox 中添加列 + 行
- powershell - 如何使用 PowerShell 工作流和检查点来实现可恢复性
- python - 迭代 Pandas 数据框中的行,保持前 2 行固定
- node.js - GCloud 中的 NodeJS 错误:找不到 openssl 路径