草庐IT

-std=gnu99

全部标签

c++ - 为什么编译器不能优化 std::string concat?

我尝试这样简单的代码:#include#includeintmain(){conststd::strings=std::string("a")+"b";puts(s.c_str());return0;}我希望编译器(gcc4.8.2/clang3.5.0)优化这样的代码intmain(){puts("ab");return0;}但我得不到这样的结果,我尝试了不同的选项,如“-Ofast”、“-flto”、“-static-libstdc++”,但总是在反汇编输出中看到三个函数调用:...callq0x4017e0...callq0x401690...callq0x401490第一个是调

c++ - 为什么 std::map 重载运算符 < 不使用比较

来自http://www.cplusplus.com/reference/map/map/operators/我注意到:“请注意,这些操作均未考虑任一容器的内部比较对象,而是直接比较元素(value_type类型)。”这就是说重载运算符“Compare在其声明中(引用http://www.cplusplus.com/reference/map/map/)std::maptemplate,//map::key_compareclassAlloc=allocator>//map::allocator_type>classmap;哪里Compare是Compare:Abinarypredic

c++ - std::array 聚合初始化需要大量令人困惑的花括号

我有以下代码:enumclassMessageDeliveryMethod{POST_MASTER,BUBBLE,NUM_ENUMERATORS};namespace{usingMapType=std::array,static_cast(MessageDeliveryMethod::NUM_ENUMERATORS)>;MapTypeg_mapping={{{"POST_MASTER",MessageDeliveryMethod::POST_MASTER},{"BUBBLE",MessageDeliveryMethod::BUBBLE},}};}这可以编译,但我不知道为什么。g_map

c++ - 防止 std::atomic 溢出

我有一个原子计数器(std::atomiccount),它向多个线程处理顺序递增的值。uint32_tmy_val=++count;在我得到my_val之前我想确保增量不会溢出(即:回到0)if(count==std::numeric_limits::max())throwstd::runtime_error("countoverflow");我认为这是一个天真的检查,因为如果在递增计数器之前由两个线程执行检查,则第二个要递增的线程将返回0if(count==std::numeric_limits::max())//if2threadsexecutethisthrowstd::runt

c++ - 从 2d std::vector 初始化 Eigen::MatrixXd

这应该非常简单,但我无法在Eigen文档中找到实现它的方法。假设我有一个2Dvector,即std::vector>data假设它充满了10x4数据集。我如何使用这些数据来填写Eigen::MatrixXdmat.最明显的方法是像这样使用for循环:#PseudocodeEigen::MatrixXdmat(10,4);fori:1->10mat(i,0)=data[i][0];mat(i,1)=data[i][1];...end但应该有更好的Eigen原生方法? 最佳答案 没问题。你不能一次完成整个矩阵,因为vector将单行存储

c++ - 为什么我要打开一个没有 std::ios::binary 的文件 (std::ifstream)?

这可能属于StackExchange的不同部分,但我不这么认为-programmers.se更多的是关于其他事情。进入问题:有些事情可以用std::ios::binary做,但在文本模式下不能做(例如,相对搜索),但我找不到在文本模式下可以做的,你不能在二进制模式下做的事情模式-甚至将文件作为文本读取,例如std::getline()那么为什么我会以文本形式打开呢?作为一个可能相关的问题,为什么不默认打开二进制文件?这会破坏谁的用例?编辑附加信息这是让我问的原因:我有一个在Windows系统上创建的文件-也就是说,行结尾是CRLF。我使用std::ios::binary标志用std::

c++ - 为什么 std::min(std::initializer_list<T>) 按值获取参数?

阅读thisquestion的答案,我惊讶地发现std::min(std::initializer_list)按值获取其参数。如果您使用std::initializer_list以其名称所暗示的方式,即作为某个对象的初始值设定项,我知道我们不关心复制它的元素,因为它们无论如何都会被复制以初始化对象。然而,在这种情况下,我们很可能不需要任何拷贝,因此将参数视为std::initializer_list似乎更合理。如果可能的话。这种情况下的最佳做法是什么?你不应该调用initializer_list吗?std::min的版本如果您关心不要进行不必要的复制,或者是否有其他一些技巧可以避免复制

c++ - 保留 std::initializer_list 的拷贝是否安全?这是什么道理?

在我的环境中,std::initializer_list被实现为指向第一个元素和大小的指针。仍然在我的特定设置中,我能够观察到:底层数据在当前函数帧中分配(因为指向第一个元素的指针是这样说的)从函数按值返回initializer_list不会更改指针的值(得出数据未与initializer_list一起复制的结论)。这使得复制initializer_list变得不安全,如果拷贝的生命周期比原始对象长。C++标准的进一步发布是否会维持这种行为?同样重要的是,这种行为背后的基本原理是什么?(今天真的很痛,所以我会天真地说这违背了“最不惊讶”的原则) 最佳答案

c++ - 有没有办法检查 std::random_device 是否实际上是随机的?

引自cppreference:std::random_deviceisanon-deterministicrandomnumberengine,althoughimplementationsareallowedtoimplementstd::random_deviceusingapseudo-randomnumberengineifthereisnosupportfornon-deterministicrandomnumbergeneration.有没有办法检查当前的实现是否使用PRNG而不是RNG(然后说错误退出),如果没有,为什么不呢?请注意,一点谷歌搜索表明至少MinGW以这种方

c++ - 为什么 make_unique 有一个可以将 std::bind 作为参数的构造函数的额外移动?

我有一个简单的类,它的构造函数如下所示:Event(std::function&&f):m_f(std::move(f)){}构造函数可以与std::bind一起使用:Thingthing;std::unique_ptrev(newEvent(std::bind(some_func,thing)));以上述方式使用它会导致“事物”的一个拷贝构造,然后在该拷贝上进行移动构造。但是,执行以下操作:std::unique_ptrev=make_unique(std::bind(some_func,thing));导致两个移动结构。我的问题是:什么时候调用“thing”的移动构造函数为什么用m