模板函数内的全局值不改变[c++]
Global values inside template function not changing [c++]
我需要一个项目的帮助。基本上,我需要测量一些排序算法的时钟刻度。由于它们都使用比较函数,有时还使用交换函数,因此我将它们设计为接受这些回调函数。
为了测量时钟的滴答声,我写:
static clock_t t1, total;
template<typename T>
bool less_default(T & left, T & right){
t1 = clock();
bool v = left < right;
t1 = clock() - t1;
total += t1
return v;
}
当我实际运行算法时,total和t1都没有反映任何变化。就好像引用它们的代码从来没有写过一样。
没有效果。
在函数调用中连一个简单整数的增量都没有。是不是静态全局变量不能在模板函数内更改?
我不明白我哪里做错了
没有效果。
在函数调用中连一个简单整数的增量都没有。
我怀疑以下内容出现在头文件中:
static clock_t t1, total;
如果是这种情况,每个翻译单元将获得两个变量的单独实例(多亏了static
)。
修复方法:将头文件中的static
改为extern
,并在.cpp文件中添加以下内容:
clock_t t1, total;
EDIT下面的示例演示了这一点:
根据OP的请求,这是一个简短的示例,使用模板比较器和答案中的配方来声明和管理运行时钟总数。
main.h
#ifndef PROJMAIN_DEFINED
#define PROJMAIN_DEFINED
extern clock_t total;
template<typename T>
bool less_default(const T& left, const T& right)
{
clock_t t1 = clock();
bool res = (left < right);
total += (clock() - t1);
return res;
};
#endif
main.cpp
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include "main.h"
using namespace std;
clock_t total = 0;
int main()
{
static const size_t N = 2048;
vector<int> values;
values.reserve(N);
std::srand((unsigned)time(0));
cout << "Generating..." << endl;
generate_n(back_inserter(values), N, [](){ static int i=0; return ++i;});
for (int i=0;i<5;++i)
{
random_shuffle(values.begin(), values.end());
cout << "Sorting ..." << endl;
total = 0;
std::sort(values.begin(), values.end(), less_default<int>);
cout << "Finished! : Total = " << total << endl;
}
return EXIT_SUCCESS;
}
Generating...
Sorting ...
Finished! : Total = 13725
Sorting ...
Finished! : Total = 13393
Sorting ...
Finished! : Total = 15400
Sorting ...
Finished! : Total = 13830
Sorting ...
Finished! : Total = 15789
设置全局变量的方式似乎有一个bug。(NPE的答案涵盖了这一点。)
然而,另一件要记住的事情是,您正在尝试通过单个比较来度量的性能。这取决于T
是什么,但对于大多数简单类型,这将是一个或两个CPU指令,远远太小,无法用这样的技术精确测量。您最好使用抽样分析器。使用这里的代码,您的检测比正在完成的工作要昂贵得多,这使得分析数据毫无用处。
相关文章:
- 变量没有改变?通过向量的函数调用
- 如何改变c++应用程序的视觉效果
- C++在不同线程中改变向量
- 如何访问和改变存储在矢量C++中的对象
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 为什么 c++ 动态数组的大小没有改变?
- 为什么提升图库的 read_graphviz() 函数会改变节点的索引
- 在向量内更改变量的值不会改变其在向量外的值
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 改变或缩放两个正态分布以具有特定的相关系数
- 当我使用CHAR_INFO结构时,控制台会无缘无故地改变颜色
- 为什么我的函数接受"std::string"进行排序不会改变它?
- MFC:你能在CDateTimeCtrl中改变自旋的加速度吗?
- 为什么切换 for 循环的顺序会显著改变执行时间?
- 使用可变参数模板改变模板参数
- C++中物体改变识别的设计模式?
- 通过从构造函数中的'this'复制的指针改变常量对象
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 如果没有重新散列,为什么 unordered_set::begin() 会改变?