有点迂腐的问题:哪个更有效率
Slightly pedantic question: which is more efficient?
哪个更有效率?还是它们都同样有效?星号线中的底层架构是怎么回事?
(1(
for(int i = m_size; i > index; --i)
{
int k = normalize(i); ***
m_data[k] = m_data[k - 1];
}
或 (2(
int k = 0; ***
for(int i = m_size; i > index; --i)
{
k = normalize(i); ***
m_data[k] = m_data[k - 1];
}
代码段 #1 对于朴素的编译器更有效,因为第二个代码段需要在变量 k 中加载 0。
一个好的编译器会认识到在 for 循环中加载 k 之前没有使用 k,并将优化额外的赋值。
您可以使用代码段 2,而无需加载 0: int k;
不要为这种微观级别的优化而烦恼。让编译器/优化器为您完成。根据C++风格,第二种方法更好,因为它声明的变量接近用法(如"代码完成"一书中所述(。除了 C 样式之外,如果您想在循环后使用变量,第一种方法很好。
请注意,函数normalize
、m_data
类型、所涉及的运算符[]
等都在优化中发挥作用。数据大小、并行度、处理器架构在程序的运行时性能中也起着重要作用。
在不知道你在说什么架构的情况下,很难说"底层架构中发生了什么"。但总的来说,任何"哪个更有效"的问题都只能以显而易见的方式真正得到回答:通过衡量哪个版本最终在您的特定应用程序中更有效率......
请注意,任何远程有用的编译器都应该将两个示例转换为完全相同的机器代码......
这不是效率问题。第一种方法更好,因为它使用 RAII(资源分配即初始化(方法。第二个更像是C风格。您应该在使用它时声明变量,而不是在功能块的开头。请参阅此示例:
void f1(bool use)
{
ComplexObject c; // creating an object that has very costly, time-and-memory-consuming initialization
if (! use)
return;
c.someFunction();
}
明白我的意思吗?
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 有点迂腐的问题:哪个更有效率