GCC:我什么时候能期望返回的大型C ++对象高效?

时间:2013-12-27 10:37:56

标签: c++ performance gcc g++

这个问题是关于C ++ 98 / C ++ 03而不是C ++ 11,并且特定于最新的GCC(4.8)并且启用了优化(例如 {{1 }})

如果我正在使用大型对象,例如

-O3

何时可以指望GCC从函数或方法中优化此类对象的struct point { float x, y; }; typedef vector<point> points; struct two { points a, b; }; ,例如

return

3 个答案:

答案 0 :(得分:1)

当你保证效率时,你总能期望效率,例如:通过移动。

否则,在通过测量证明相反的情况之前,假设效率是一件好事。

g ++ 4.8实现了大多数C ++ 11特性,包括移动语义,std::vector确实有移动构造函数(即,你不依赖于RVO)。

答案 1 :(得分:1)

在C ++ 98/03中返回对象的众所周知的经验法则是,如果你的对象可以放入你的CPU寄存器,你将从GCC中获得最大的收益。按值返回此类对象,通过引用或指针返回大于此值的对象。

使用C ++ 11标准,编译器可以更自由地移动对象,当然也可以让您显式移动它们。使用C ++ 11,我首先返回您可以通过值返回的所有内容并测量热路径,同时检查生成的程序集以确定是否值得使用引用切换到返回。关于此的经典读物是Want Speed? Pass by Value.

答案 2 :(得分:0)

Pepper_chico所述,它与return value optimization(RVO)相关。

但是,您也可以考虑针对特定实现的ABI规范。 x86-64 ABI(和x86 calling conventions)指定在某些情况下,可以使用一对寄存器来返回一个小结构(而不​​是将其传递到堆栈上)

顺便说一句,您可以查看生成的程序集(使用g++ -fverbose-asm -S -O3)或中间的gimple表示(使用g++ -fdump-tree-all -O3转储大量文件,或使用MELT .... )。

一些“大”对象实际上是作为指针实现的(适合寄存器)。例如std::string的实例(在Linux上,使用来自GCC 4.7或4.8的libstdc ++,sizeof(std::string) == sizeof(void*)),即使基础字符串有数百万字节。同样,sizeof(std::vector<point>)通常3*sizeof(void*)即使对于数百万point - s的向量... {/ p>