这个问题是关于 C++98/C++03 而不是 C++11,并且特定于打开优化的最新 GCC (4.8)(例如 -O3
)
如果我正在处理大型对象,例如
struct point {
float x, y;
};
typedef vector<point> points;
struct two {
points a, b;
};
我什么时候可以期望 GCC 优化函数或方法中此类对象的返回
,例如
vector<two> large;
//...
return large;
最佳答案
作为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*)
即使是数百万的 vector point
-s ...
关于c++ - GCC:我什么时候可以期望返回大型 C++ 对象是高效的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20799171/