Questions tagged «c++11»

将此标记用于必须作为C ++ 11编译的代码(不使用C ++ 14或更高版本中引入的任何功能)。

3
GCC 4.8中C ++ 11 thread_local变量的性能损失是多少?
从GCC 4.8变更日志草案中: G ++现在实现了C ++ 11 thread_local关键字;这与GNU__thread关键字的主要区别在于它允许动态初始化和销毁​​语义。不幸的是,此支持要求引用非函数局部thread_local变量,即使它们不需要动态初始化也需要运行时惩罚 ,因此用户可能希望继续使用__thread具有静态初始化语义的TLS变量。 这种运行时惩罚的本质和来源到底是什么? 显然,要支持非函数局部thread_local变量,在进入每个线程主线程之前都需要一个线程初始化阶段(就像全局变量有一个静态初始化阶段一样),但是它们是否指的是超出此范围的运行时代价? ? 粗略地说,gcc的thread_local新实现的体系结构是什么?

2
C ++ 17中新的基于范围的for循环如何帮助Ranges TS?
该委员会将基于范围的for循环从: C ++ 11: { auto && __range = range_expression ; for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) { range_declaration = *__begin; loop_statement } } 到C ++ 17: { auto && __range = range_expression ; auto __begin = begin_expr ; auto __end = end_expr ; …
71 c++  c++11  for-loop  c++17 

2
为什么`std :: initializer_list`通常按值传递?
我在SO上看到的几乎所有帖子中都包含a std::initializer_list,人们倾向于std::initializer_list按值传递a 。根据这篇文章: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ 如果要复制所传递的对象,则应按值传递。但是复制astd::initializer_list不是一个好主意,因为 复制astd::initializer_list不会复制基础对象。在原始初始化程序列表对象的生存期结束后,不能保证基础数组存在。 那么,为什么它的一个实例经常按值而不是按值传递const&,即保证不会产生不必要的复制?
71 c++  c++11 

3
std :: atomic的锁在哪里?
如果数据结构中包含多个元素,则其原子版本不能(始终)是无锁的。有人告诉我,这对于较大的类型是正确的,因为CPU无法在不使用某种锁的情况下原子地更改数据。 例如: #include <iostream> #include <atomic> struct foo { double a; double b; }; std::atomic<foo> var; int main() { std::cout << var.is_lock_free() << std::endl; std::cout << sizeof(foo) << std::endl; std::cout << sizeof(var) << std::endl; } 输出(Linux / gcc)为: 0 16 16 由于原子和foo的大小相同,因此我认为原子中不会存储锁。 我的问题是: 如果原子变量使用锁,它将存储在哪里,这对于该变量的多个实例意味着什么?
71 c++  c++11  x86  atomic  stdatomic 

2
我应该分配或重置unique_ptr吗?
在通常情况下,拥有对象的生命周期与其拥有者相关联,我可以使用2种方法之一的唯一指针。。 可以分配: class owner { std::unique_ptr<someObject> owned; public: owner() { owned=std::unique_ptr<someObject>(new someObject()); } }; 可以使用reset方法: class owner { std::unique_ptr<someObject> owned; public: owner() { owned.reset(new someObject()); } }; 为了最佳实践,我是否应该优先选择一种形式? 编辑:对不起人们。我过度简化了这一点。堆分配以初始化方法而不是ctor进行。因此,我不能使用初始化程序列表。

7
在哪里可以了解有关C ++ 0x的更多信息?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案能得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我想了解更多有关C ++ 0x的信息。有哪些好的参考资料和资源?有人写过关于这方面的好书吗?

5
为什么使用mingw gcc4.8.1的std :: random_device每次运行都得到相同的序列?
我使用以下代码来测试C ++<random>库。 为什么每次编译的可执行文件都会得到完全相同的序列?是rd()在编译时确定的?每次运行如何获得不同的输出? Windows 7 64位上的GCC 4.8.1。使用http://nuwen.net/mingw.html中的MinGW分发。 编辑:我用Visual Studio测试了相同的代码。没有问题。输出是不确定的。这可能是我使用的mingw gcc 4.8.1中的错误。 #include <iostream> #include <random> using namespace std; int main(){ random_device rd; mt19937 mt(rd()); uniform_int_distribution<int> dist(0,99); for (int i = 0; i< 16; ++i){ cout<<dist(mt)<<" "; } cout <<endl; }
70 c++  c++11  random  stl 

11
使用C ++ 11进行重构
鉴于c ++提供了许多程序员的新工具集,其目的是简化代码,表达性,提高效率,浏览旧代码并进行调整(有些毫无意义,有些成功)以实现其目标。在尝试不花太多时间从事此类工作并且仅进行非侵入性且自成一体的更改时,最佳实践是什么? 让我删掉显而易见的内容: 使用auto运行基于迭代器的循环: for (std::vector<foo>::const_iterator it(lala.begin()), ite(lala.end()); it != ite; ++it); // becomes for (auto it(lala.cbegin()), ite(lala.cend()); it != ite; ++it); 将tie用于仅产生C样式代码行的多个分配(如何一次将多个值分配给一个结构?) a = 1; b = 2; c = 3; d = 4; e = 5; // becomes std::tie(a, b, c, d, e) = std::make_tuple(1, 2, 3, 4, …
70 c++  c++11  refactoring 

4
C ++ lambda表达式的生命周期是多少?
(我已经阅读了lambda派生的隐式函子在C ++中的寿命是什么?并且它不能回答这个问题。) 我知道C ++ lambda语法只是使用调用运算符和某些状态创建匿名类的实例的糖,并且我了解该状态的生存期要求(由您是否通过按引用的值捕获来确定。) Lambda对象本身的生命周期?在以下示例中,std::function返回的实例是否有用? std::function<int(int)> meta_add(int x) { auto add = [x](int y) { return x + y; }; return add; } 如果是,它将如何工作?对我来说,这似乎太神奇了-我只能通过std::function复制整个实例来想象它能工作,这取决于我捕获的内容,可能非常繁琐-过去我std::function主要使用裸函数指针,而复制这些实例是快。鉴于std::function类型的擦除,这似乎也有问题。
70 c++  lambda  c++11 

4
移动向量会使迭代器无效吗?
如果我在vector中有一个迭代器a,那么我b从中移动向量或移动分配向量a,该迭代器是否仍指向同一元素(现在在vector中b)?这就是我在代码中的意思: #include <vector> #include <iostream> int main(int argc, char *argv[]) { std::vector<int>::iterator a_iter; std::vector<int> b; { std::vector<int> a{1, 2, 3, 4, 5}; a_iter = a.begin() + 2; b = std::move(a); } std::cout << *a_iter << std::endl; // Is a_iter valid here? return 0; } 是否a_iter仍然有效的,因为a已移入b,或者是通过招无效的迭代器?供参考,std::vector::swap 不会使迭代器无效。
70 c++  iterator  c++11 

7
传递值然后移动构成一个坏习惯吗?
由于我们在C ++中具有移动语义,因此如今很常见 void set_a(A a) { _a = std::move(a); } 理由是,如果a是右值,则副本将被删除,并且只有一招。 但是,如果a是左值会怎样?似乎将有一个副本构造,然后是一个移动分配(假设A具有正确的移动分配运算符)。如果对象具有太多的成员变量,则移动分配的成本可能很高。 另一方面,如果我们这样做 void set_a(const A& a) { _a = a; } 将只有一份副本分配。如果我们要传递左值,是否可以说这种方法比按值传递惯用法更可取?

5
为什么要使用std :: async?
在尝试使用std :: async并阅读其定义的同时,我试图深入探索新C ++ 11标准的所有选项,我注意到至少在gcc 4.8.1的Linux下有两件事: 它称为async,但它确实具有“顺序行为”,基本上在您调用与async函数foo相关联的future的行中,该程序将阻塞直到foo执行完毕。 它取决于与其他库完全相同的外部库以及更好的非阻塞解决方案,这意味着pthread,如果要使用std::async,则需要pthread。 在这一点上,我很自然地问为什么甚至在一组简单的函子上都选择std :: async?该解决方案甚至根本无法扩展,您调用的未来越多,程序的响应性就越差。 我想念什么吗?您能否显示一个示例,该示例被授予以异步,非阻塞方式执行?

4
那将是“你好,世界!” 例如“ std :: ref”?
有人可以举一个简单的例子来演示功能std::ref吗?我的意思是一个示例,其中仅在无法解释时才使用其他一些构造(如元组或数据类型模板)的例子std::ref。 我在std::ref 这里和这里发现了两个问题。但是在第一个中,它涉及编译器中的错误;在第二个中,std::ref它不包含使用示例,std::ref它们涉及元组和数据类型模板,这使得对这些示例的理解变得复杂。
70 c++  c++11  std  ref 

4
为什么在Herb Sutter的CppCon 2014演讲(返回基础知识:现代C ++风格)中不建议采用赋值设置器成员函数?
在Herb Sutter的CppCon 2014演讲“回到基础:现代C ++风格”中,他在幻灯片28(此处是幻灯片的网络副本)上提到了这种模式: class employee { std::string name_; public: void set_name(std::string name) noexcept { name_ = std::move(name); } }; 他说这是有问题的,因为当用临时调用set_name()时,noexcept-ness并不强(他使用短语“ noexcept-ish”)。 现在,我在自己最近的C ++代码中已经大量使用了上述模式,主要是因为它使我每次都不必键入两个set_name()副本-是的,我知道每次强制执行一个副本构造可能会有点效率低下,但嘿,我是一个懒惰的打字员。但是,Herb的短语“ this noexcept有问题”令我担心,因为我在这里没有遇到问题:std :: string的移动赋值运算符是noexcept,它的析构函数也是如此,因此对我来说,上面的set_name()似乎可以保证noexcept。我确实在编译器准备参数时在set_name()之前看到了潜在的异常抛出,但是我正在努力将其视为有问题的。 后来在幻灯片32上,赫伯清楚地指出以上内容是反模式。有人可以向我解释为什么我懒得写不好的代码吗?
70 c++  c++11  stl 

2
可以在头文件中使用lambda违反ODR吗?
可以将以下内容写在头文件中: inline void f () { std::function<void ()> func = [] {}; } 要么 class C { std::function<void ()> func = [] {}; C () {} }; 我猜在每个源文件中,lambda的类型可能不同,因此std::function(target_type的结果中包含的类型会有所不同)。 尽管看起来像是一种常见模式并且是合理的做法,但这是否违反了ODR(一个定义规则)?第二个样本是否每次都违反ODR?或者仅在头文件中至少有一个构造函数时才违反?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.