当我启用C ++ 11时,我在一个小的C ++代码片段中发现了一个有趣的性能回归: #include <vector> struct Item { int a; int b; }; int main() { const std::size_t num_items = 10000000; std::vector<Item> container; container.reserve(num_items); for (std::size_t i = 0; i < num_items; ++i) { container.push_back(Item()); } return 0; } 用g ++(GCC)4.8.2 20131219(prerelease)和C ++ 03我得到: milian:/tmp$ g++ -O3 main.cpp && perf stat -r 10 ./a.out […]
我最近遇到了以下深奥的一段代码。 int main(){(([](){})());} 重新格式化如下,使其更具可读性: int main(){ (([](){})()); // Um… what?!?! } 但是我不明白怎么(([](){})())是有效的代码。 它看起来不像函数指针语法。 它不能是一些运营商重载的伎俩。 代码按原样编译。 Google对这个全符号search没有什么帮助。 但它在Visual Studio 2010中编译并不输出。 没有错误,也没有警告。 所以它看起来像有效的代码。 我从来没有见过任何有效的代码,这是离奇的Javascript和C函数指针之外 。 有人可以解释这是如何有效的C ++?
我正在尝试将我的C ++编译器更新到C ++ 11。 我已经search了一下,我得出结论,我必须使用标志-std=c++0x或-std=gnu++0x ,但我不知道关于标志的许多事情。 谁能帮我? (我正在使用Ubuntu 12.04。) 这里是我从编译器中得到的错误,当我尝试使用包含在C ++ 11(即数组)中的库时: #include <array> #include <iostream> int main() { std::array<int, 3> arr = {2, 3, 5}; … } This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or […]
C ++ 11允许inline namespace ,其所有成员也都自动位于封闭namespace 。 我想不出任何有用的应用程序 – 有人可以请一个简短,简洁的例子,一个inline namespace是必要的,它是最习惯的解决scheme? (另外,我不清楚当一个namespace在一个声明中是inline ,而不是所有的声明,这些声明可能存在于不同的文件中,这不是乞求麻烦吗?)
C ++代码是否可以符合C ++ 03标准和C ++ 11标准,但根据编译的标准做不同的事情?
有一个优秀的C ++解决scheme(实际上是2个解决scheme:recursion和非recursion)到整数向量向量的笛卡尔乘积 。 为了说明/简单起见,让我们只关注非recursion版本 。 我的问题是,如何可以推广这个代码与模板采取一个std::tuple同构向量std::tuple看起来像这样: {{2,5,9},{"foo","bar"}} 并生成一个tuple向量 {{2,"foo"},{2,"bar"},{5,"foo"},{5,"bar"},{9,"foo"},{9,"bar"}} 如果它使生活更容易,让我们假设input中的内部向量是均匀的。 所以这样的input是不允许的 : {{5,"baz"}{'c',-2}} 编辑改变input从锯齿状vector到元组
如何为具有unique_ptr成员variables的类实现复制构造函数? 我只考虑C ++ 11。
这应该是一个例子: #include <iostream> using namespace std; int main() { cout << "Hola, moondo.\n"; } 它引发错误: gcc -c main.cpp gcc -o edit main.o main.o: In function `main': main.cpp:(.text+0xa): undefined reference to `std::cout' main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char,std::char_traits<char> >& std::operator<< <std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char> >&, char const*)' main.o: In function `__static_initialization_and_destruction_0(int,int)': main.cpp:(.text+0x3d): undefined reference to `std::ios_base::Init::Init()' main.cpp:(.text+0x4c): undefined reference […]
我想了解一些关于如何正确思考C ++ 11闭包和std::function的信息,以及它们如何实现以及如何处理内存。 尽pipe我不相信过早的优化,但是在编写新代码的时候,我确实有习惯认真考虑我的select对性能的影响。 我也做了相当数量的实时编程,例如在微控制器和audio系统上,要避免非确定性内存分配/释放暂停。 因此,我想更好地了解何时使用或不使用C ++ lambdaexpression式。 我目前的理解是,没有捕获闭包的lambda完全像Ccallback。 但是,当通过值或引用捕获环境时,会在堆栈上创build一个匿名对象。 当一个函数必须返回一个值闭包时,它会把它包装在std::function 。 在这种情况下closures内存会发生什么? 它是从堆栈复制到堆? 每当std::function被释放时它是否被释放,也就是说,它是否像std::shared_ptr一样被引用计数? 我想在一个实时系统中,我可以设置一个lambda函数链,将B作为延续parameter passing给A,以便创build一个处理pipe道A->B 在这种情况下,A和Bclosures将被分配一次。 虽然我不确定这些是否会被分配在堆栈或堆上。 但是总的来说,这在实时系统中似乎是安全的。 另一方面,如果B构造了一些返回的lambda函数C,那么C的内存将被重复地分配和释放,这对于实时使用是不可接受的。 在伪代码中,我认为将是一个实时安全的DSP环路。 我想执行处理块A然后B,其中A调用它的参数。 这两个函数都返回std::function对象,所以f将是一个std::function对象,其环境存储在堆中: auto f = A(B); // A returns a function which calls B // Memory for the function returned by A is on the heap? // Note that A and B may […]
[dcl.attr.noreturn]提供了以下示例: [[ noreturn ]] void f() { throw "error"; // OK } 但是我不明白[[noreturn]]是什么意思,因为函数的返回types已经是void 。 那么, noreturn属性的重点是什么? 它应该如何使用?