c++ - GCC:我什么时候可以期望返回大型 C++ 对象是高效的?

标签 c++ performance gcc g++

这个问题是关于 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/

相关文章:

c++重载流运算符,引用参数和匿名实例

python - 两个列表,在 python 中比较更快

java - NetBeans 永远运行 "Validating Tool collection on localhost"

c++ - 什么是类(class)的 VTT?

c++ - 字符串类 C++

c# - 难以从 C# 调用非托管 dll

c++ - C++ 中图像序列的全局运动估计

android - TextInputLayout 中的 EditText 滞后

python - 将 numpy 数组映射到网格

c++ - 如何在没有可变函数的情况下循环函数的参数