坚持std :: Chrono Time_point实例的正确方法是什么? typedef std::chrono::time_point time_point_t; time_point_t tp = std::chrono::high_resolution_clock::now(); serializer.write(tp); . . . time_point_t another_tp; serializer.read(another_tp); 呼叫写入/读取,假设可以以某种方式转换为字节表示的type time_point_t的实例,然后可以将其写入或从磁盘或插座等上写入或读取. . ALF建议的可能解决方案如下: std::chrono::high_resolution_clock::time_point t0 = std::chro
以下是关于 c++11 的编程技术问答
我正在尝试学习C ++,并试图解决一个问题,在给定许多步骤以及可以攀登步骤的可能方法的数量,给出所有可能的方式的排列,您可以爬上步骤.因此,例如,如果有5个步骤可以攀爬,我可以一次上升1步,一次或一次3步,我需要打印出所有1、2和3的排列总计5:[1, 1, 1, 1, 1],[1, 1, 1, 2],.... 我从此代码开始(尚未完成),但是我会收到此错误: Undefined symbols for architecture x86_64: "_num_steps(int, std::__1::vector >, std::__1::vector >, std::__1::allocator > > >, std::__1:
我正在寻找使用C +++ 的置换,组合和Powerset的实现 解决方案 使用stl: 置换: 使用std::next_permutation template void Permutation(std::vector v) { std::sort(v.begin(), v.end()); do { std::copy(v.begin(), v.end(), std::ostream_iterator(std::cout, " ")); std::cout void Combination(const std::vector& v, std::size_t count)
我很好奇std:next_permutation是如何实现的,所以我提取了gnu libstdc++ 4.7版本,并对标识符进行了消毒和格式以产生以下演示... #include #include #include using namespace std; template bool next_permutation(It begin, It end) { if (begin == end) return false; It i = begin; ++i; if (i == end) return false; i = end; --i; while (true) {
已知clock()可能显示出小于或大于实时值的值 - 两种情况在以下示例1和2中显示. 对于C ++ 11中时间的高精度测量,我们可以使用: std::chrono::high_resolution_clock::now(); - 保证高精度 std::chrono::steady_clock::now(); - 保证该测量实时 clock(); - 保证高精度,但要测量CPU-Cycles而不是时间 time(&t_start); - 不是高精度,而是测量实时 1- 例如: http://ideone.com/sudwtm #include #include #include #include #include int main(void) { std::cout
在C ++ 11中,使用arma_rng::set_seed_random()会生成瓶颈.我展示了一种复制它的方法. 考虑此简单代码: #include // Load Armadillo library. using namespace arma; int main() { bool jj = true; while ( jj == true ){ arma_rng::set_seed_random(); // Set the seed to generate random numbers. double rnd_number = randu(); // Generate a random number. } } 我用 编译了它 g++ -std=c++11 -Wall -g bayesian_estimation.cpp -o bayesian_estimation -O
学习的课程,在做基准时始终使用优化... 我决定将std::unique_ptr视为我程序的替代方案.为什么不重要的原因. 使用编译器优化后,它们似乎需要等效的时间. 我如何测试: time_t current_time; time(¤t_time); srand((int)current_time); //int* p0 = new int[NUM_TESTS]; //int* p1 = new int[NUM_TESTS]; std::unique_ptr u_p0{ new int[NUM_TESTS] }; std::unique_ptr u_p1{ new int[NUM_TESTS] }; for (unsigned i = 0; i
例如: object* pObject = nullptr; 或: object* pObject = 0; 再次,哪个更好的表现? 解决方案 nullptr是类型std::nullptr_t,因此构造函数被超载.这意味着将其编码为null的事实,因此可以通过避免有条件的速度来更快. 指针显然没有超载的构造函数,因此您是否使用0或nullptr是无关紧要的.相同的机器代码,相同的性能. 无论如何,使用nullptr当您想要空指针时.要小心0,因为它称为整数超载而不是指针. 其他解决方案 它们完全一样.文字0可用于初始化指针的事实纯粹是语言语法的一部分,并由编译器处理.结果与使用nullptr初始化指针相同:您获得了一个空指针. nullptr是类型系统的一部分,与生成的机器代码无关. (它存在,因此有一个具有指针类型的文字,但不存在.) 其他解决方案 我假设您是指std :: string. 我也假设您打算键入strin
我有十二个线程读取指针,一个可能会更改指针的线程大概一个小时左右. 读者是超级,超级,超级敏感的.我听说atomic或任何要避免的主要内存的速度. 在现代(例如,2012年及以后)的服务器和高端桌面Intel中,是否可以保证一个8个字节的常规指针,如果正常阅读和书写,请不要撕裂?我对我的测试跑一个小时而没有看到眼泪. 否则,如果我在原子上和读物正常读写,会更好(或更糟)吗?例如,通过结合两者? 请注意,关于混合原子和非原子操作的其他问题,这些问题没有指定CPU,讨论将其推向了语言律师.这个问题与规格无关,而是到底会发生什么,包括我们是否知道规格未定义的情况会发生什么. 解决方案 x86永远不会将ASM负载或存储在对齐的指针宽度值中.这个问题的那部分和您的另一个问题( c ++在现代英特尔上:我疯了还是非原子对齐的64位负载/商店实际上是原子?)都是重复的 为什么要进行整数分配x86上的自然对齐变量原子? 这是为什么atomic对
我在Windows 7 64位,VS2013(X64 Release Build)实验内存订购.我想使用最快的同步共享对容器的访问.我选择了原子比较. 我的程序产生了两个线程.作者推到向量,读者检测到这一点. 最初我没有指定任何内存订购,所以我假设它使用memory_order_seq_cst? 使用memory_order_seq_cst延迟为340-380个周期 尝试提高性能,我使商店使用memory_order_release使用memory_order_acquire. . 然而,潜伏期增加到约1,940个周期 我误解了什么吗?下面的完整代码. 使用默认值memory_order_seq_cst: #include #include #include #include std::atomic _lock{ false }; std::vector
我认为,如果必须包含的标头文件数量尽可能少,则C ++库是"优雅的". 我知道现有的固定尺寸分配器,例如Loki::SmallObjectAllocator和boost::pool.尽管两者都很棒,但我认为它们并不优雅,并且不容易被无缝整合到项目中. 大多数情况下,我只需要Boost库的一小部分,但是我必须在计算机上安装整个库.例如,如果我想使用boost :: pool,我希望只包含一个标题文件boost_pool.h,然后完成工作.因为我认为固定尺寸的分配器不应如此依赖太多其他组件.我认为,理想代码应该看起来如下: #include int main() { boost::pool p; int* v = p.allocate(); } 是否存在这样的库? 解决方案 欢迎您进入 mine .无论是否优雅,您都可以决定.但这只是一个简短的标头,仅取决于几个小标准标题.分配器符合C ++ 11分配器的要求
我前几天正在玩,试图看看我可以优化一些东西.我决定从一个简单的地图开始,该地图仅进行线性搜索以查找是否存在元素,然后尝试优化其中的大部分.另外,为了比较,我使用std :: find的std :: map和std ::向量也这样做. 与我的地图相比,地图的结果是预期的,创建速度较慢和破坏,但是速度要高得多(实际上,我无法修饰它,它返回0. 问题在于std :: vector.我期望它比我的实施慢,但不是,我真的不明白它是如何相同或更快的,因为我的实施是跳过最坏的情况(该值不在矢量中),并且是使用结果缓存. 任何人都可以在这里散发一些灯光吗?我知道STL背后的家伙是半神,但这仍然没有意义. 基准结果(i3,Windows 8.1 Pro 64,Visual Studio 2013): std::vector : Build : 85.0042 ms Loop : 37.0011 ms Find : 1.82259 ms -> First :
绑定函数(使用Boost Bind)时是否会产生任何性能影响(正面或负面)? 解决方案 也许不是.这取决于 std::bind(或boost::bind)的结果是所谓的"绑定表达式",它具有由实现确定的不可知类型.这种类型是可召唤,它是可转换到std::function的实例(或boost::function). 内部,function(可能)使用类型擦除来处理各种复杂,状态的"可呼叫对象".这需要在某些情况(尽管不一定全部)情况下进行动态分配和虚拟调度. bind和function都陈述了,因为它们存储了绑定的参数. 结果是,如果可能的话,您应该避免将绑定表达式转换为function对象.绑定表达式本身可能会更便宜,并且您不应该害怕使用bind(例如,在将成员函数指针与实例和参数结合时).自由使用bind,但仅当您真正需要管理可呼叫实体的异质集合时才转换为function. 这是两个典型示例: 坏;避免这样做: std::function
绑定函数(使用Boost Bind)时是否会产生任何性能影响(正面或负面)? 解决方案 也许不是.这取决于 std::bind(或boost::bind)的结果是所谓的"绑定表达式",它具有由实现确定的不可知类型.这种类型是可召唤,它是可转换到std::function的实例(或boost::function). 内部,function(可能)使用类型擦除来处理各种复杂,状态的"可呼叫对象".这需要在某些情况(尽管不一定全部)情况下进行动态分配和虚拟调度. bind和function都陈述了,因为它们存储了绑定的参数. 结果是,如果可能的话,您应该避免将绑定表达式转换为function对象.绑定表达式本身可能会更便宜,并且您不应该害怕使用bind(例如,在将成员函数指针与实例和参数结合时).自由使用bind,但仅当您真正需要管理可呼叫实体的异质集合时才转换为function. 这是两个典型示例: 坏;避免这样做: std::function
我正在使用一些非常大的std::unordered_map S(数亿个条目),需要保存和从文件中保存和加载它们.我目前这样做的方式是通过地图迭代并读取/编写每个密钥和价值对一对: std::unordered_map map; void save(){ std::unordered_map::iterator iter; FILE *f = fopen("map", "wb"); for(iter=map.begin(); iter!=map.end(); iter++){ fwrite(&(iter->first), 8, 1, f); fwrite(&(iter->second), 1, 1, f); } fclose(f); } void load(){ FILE *f =