相关疑难解决方法(0)

C++ 11中引入了哪些重大变化?

我知道至少有一个C++ 11中的更改​​会导致一些旧代码停止编译:explicit operator bool()在标准库中引入,替换旧的实例operator void*().当然,这将破坏的代码可能是首先不应该有效的代码,但它仍然是一个重大变化:过去不再有效的程序.

还有其他重大变化吗?

c++ c++11

226
推荐指数
9
解决办法
3万
查看次数

C++向量数组运算符的计算成本高吗?

我一直都知道C++的丰富抽象带来了一定的计算开销,但我的印象是,一旦应用了正确的编译器优化,这种开销几乎可以忽略不计.我很好奇这个开销的大小究竟是多少,所以我写了一个简单的测试来确定这一点.测试是一个模板化函数,它接受一个容器变量,为容器中的每个元素赋值,然后在一个单独的循环中对容器中的值求和.该过程重复预定的循环次数.

令我非常不安的是,我发现矢量实现几乎是标准阵列实现的3倍.在通过大量选择的编译器优化进行置换而没有任何成功之后,我决定咬紧牙关并直接观察汇编代码以尝试查看导致时间损失的原因.我包含了一些汇编指令,这些指令允许我精确地确定数组索引操作发生的位置并详细检查代码.令我完全困惑的是,我发现向量实现和数组实现之间的区别是完全无关紧要的.汇编代码可以在这里找到.

这是我用来构建二进制文件的命令:

g++ -O3 vectorArrayOp.cpp -o vectorArrayOp
Run Code Online (Sandbox Code Playgroud)

这是我用来构建程序集的命令:

g++ -O3 -DTAGASM vectorArrayOp.cpp -S -o vectorArrayOp.s
Run Code Online (Sandbox Code Playgroud)

这是我在运行二进制文件时观察到的输出:

gmurphy@interloper:Reference$ ./vectorArrayOp 
Duration 0.027678
Duration 0.090212
Run Code Online (Sandbox Code Playgroud)

当您在stdout流中包含计算值时,结果不会更改,为清楚起见,我删除了它们.我的系统规格如下(我在AMD上也看到过相同的结果):

Linux 3.2.0-32-generic x86_64 GNU/Linux
Intel(R) Xeon(R) CPU X5550  @ 2.67GH
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Run Code Online (Sandbox Code Playgroud)

代码如下,如果有人能够让我深入了解为什么在装配如此相似时时序如此不同,我将不胜感激.

#include <vector>
#include <iostream>
#include <sys/time.h>
#ifdef TAGASM
#define ASMTAG(X) asm(X)
#else
#define ASMTAG(X)
#endif 
enum { DataSize=1024, NumTests=(1<<16) } ;
struct ReturnValue {ReturnValue(float _d, int _t):d(_d), t(_t){} float d; int t;} ;
template <typename Container, typename Type>
ReturnValue …
Run Code Online (Sandbox Code Playgroud)

c++ linux profiling g++

8
推荐指数
1
解决办法
493
查看次数

标签 统计

c++ ×2

c++11 ×1

g++ ×1

linux ×1

profiling ×1