Tag: c ++ 11

双重检查locking单身人士在C + + 11

下面的单例实现数据竞赛是免费的吗? static std::atomic<Tp *> m_instance; … static Tp & instance() { if (!m_instance.load(std::memory_order_relaxed)) { std::lock_guard<std::mutex> lock(m_mutex); if (!m_instance.load(std::memory_order_acquire)) { Tp * i = new Tp; m_instance.store(i, std::memory_order_release); } } return * m_instance.load(std::memory_order_relaxed); } 加载操作的std::memory_model_acquire是多余的? 是否有可能通过切换到std::memory_order_relaxed进一步放宽加载和存储操作? 在这种情况下, std::mutex的获取/释放语义是否足以保证其正确性,或者需要进一步的std::atomic_thread_fence(std::memory_order_release)来确保构造函数的内存写入发生在轻松的商店? 然而,使用围栏相当于有memory_order_release商店吗? 编辑 :感谢约翰的答案,我想出了下面的应该是免费的数据竞赛的实现。 即使内部的负载可能是非primefaces的,我决定放松一下,不影响性能。 相比之下,总是有获取内存顺序的外部负载,thread_local机制提高了访问实例大约一个数量级的性能。 static Tp & instance() { static thread_local Tp *instance; if (!instance && !(instance […]

C ++ 11 static_assert和模板实例化

在C ++ 11中,模板中的static_assert操作应该取决于该模板是否已经实例化? 例如,用下面的代码 template <int I> void sa() { static_assert(0,"Hello."); } int main(int argc, char *argv[]) { return 0; } GCC 4.5.0将失败断言,并产生“你好”。 信息。 另一方面,Digital Mars Compiler版本8.42n没有提供任何消息。

在编译时获取静态constexpr数组的最小/最大值

比方说,我有一个像这样定义的整数数组: static constexpr int IntArray[] = {1, 5, 10, 12, 17}; 有没有办法在编译时获得最小值或最大值?

将未知大小的std ::数组传递给一个函数

在C ++ 11中,我将如何去编写一个函数(或方法),它需要一个已知types的未知大小的std ::数组? // made up example void mulArray(std::array<int, ?>& arr, const int multiplier) { for(auto& e : arr) { e *= multiplier; } } // lets imagine these being full of numbers std::array<int, 17> arr1; std::array<int, 6> arr2; std::array<int, 95> arr3; mulArray(arr1, 3); mulArray(arr2, 5); mulArray(arr3, 2); 在我的search过程中,我只find了使用模板的build议,但是这些看起来很乱(头文件中的方法定义),而我试图完成的东西太多了。 有一个简单的方法来做这个工作,就像一个简单的C风格的数组?

那么unique_ptr可以安全地在stl集合中使用吗?

我与unique_ptr和右值移动哲学混淆。 假设我们有两个集合: std::vector<std::auto_ptr<int>> autoCollection; std::vector<std::unique_ptr<int>> uniqueCollection; 现在我期望下面的失败,因为没有告诉内部的algorithm是什么,也许做内部枢纽副本之类的东西,从而剥夺了auto_ptr的所有权: std::sort(autoCollection.begin(), autoCollection.end()); 我明白了 编译器正确地禁止这种情况发生。 但是,我这样做: std::sort(uniqueCollection.begin(), uniqueCollection.end()); 这个编译。 我不明白为什么。 我不认为unique_ptrs可以被复制。 这是否意味着一个枢轴值不能被采取,所以sorting效率较低? 或者这个枢轴实际上是一个移动,事实上,它与auto_ptrs的集合一样危险,应该被编译器所禁止? 我想我错过了一些关键的信息,所以我急切地等待有人给我提供啊哈! 时刻。

同居的boost :: shared_ptr和std :: shared_ptr

我想在某些时候使用boost::log ,但是我不能传递std::shared_ptr作为参数,因为编译器(VS2010)不能将它转换成boost::shared_ptr 。 我真的不喜欢他们是彼此外星人的事实。 有没有一种安全而透明的方法可以将一个人变成另一个人,以免彼此绊倒? 我不认为这两个问题是相同的这个问题的重复。

std :: advance和std :: next有什么区别?

是否有更多超越前进负数?

如何将c ++ 11支持添加到syntim vim插件?

我在我的c + + 11项目中使用synthesis。 当我在vim中进行编辑时,保存(:w)合成插件会给每个初始化程序列表上的错误提供一个错误,而且每个循环显然都缺lessc ++ 11function。 我使用病原体安装了synthesis。 这里有两个例子,我得到的初始化列表和每个循环(都编译好的C + + 11)的错误:

如何获得持续时间,如int毫秒和浮点秒<chrono>?

我正在尝试使用计时器库和计时器。 我希望能够有一个Duration frameStart; (从app开始)和Duration frameDelta; (帧之间的时间) 我需要能够获得frameDelta持续时间毫秒和浮点秒。 你如何用新的c ++ 11 <chrono>库做到这一点? 我一直在努力和谷歌search(信息稀疏)。 代码是沉重的模板,需要特殊的演员和东西,我不知道如何正确使用这个库。

为什么我应该使用std :: async?

我试图深入探讨新的C ++ 11标准的所有选项,同时使用std :: async并阅读它的定义,我注意到了2件事,至less在linux下使用gcc 4.8.1: 它被称为asynchronous ,但它有一个真正的“顺序行为”,基本上在你调用与你的asynchronous函数foo相关联的未来的行中,程序阻塞直到foo执行完成。 它依赖于与其他外部库完全相同的外部库,以及更好的非阻塞解决scheme,这意味着pthread ,如果要使用std::async ,则需要pthread。 在这一点上,我很自然的问为什么selectstd :: async而不是一组简单的函子呢? 这个解决scheme甚至根本就没有规模,你呼叫的未来越多,程序响应也就越less。 我错过了什么吗? 你能否展示一个被授予以asynchronous,非阻塞方式执行的例子?