假设我有一个生成大结构的函数(在本例中是一个巨大的 std::vector),以及一个重复调用它的循环:
std::vector<int> render(int w, int h, int time){
std::vector<int> result;
/* heavyweight drawing procedures */
return result;
};
while(loop){
std::vector<int> image = render(800,600,time);
/*send image to graphics card*/
/*...*/
};
我的问题是:在这种情况下,GCC/Clang 是否足够聪明,可以避免在每次迭代时为这个巨大的 800x600x4 数组分配内存?换句话说,这段代码的表现是否类似于:
void render(int w, int h, int time, std::vector<int>& image){ /*...*/ }
std::vector<int> image;
while(loop){
render(800,600,time,image);
/*...*/
}
为什么会出现这个问题:我正在制作一个从一种语言到 C++ 的编译器,我必须决定我要走哪条路;如果我像第一个示例或最后一个示例那样编译它。第一个是微不足道的;最后一个需要一些棘手的编码,但如果速度快得多,可能是值得的。
最佳答案
在 99% 的情况下,按值返回除最琐碎的对象之外的所有对象都会变慢。构建整个拷贝的工作量std::vector<int>
,如果 vector 的长度是无限的,将是可观的。如果说您的 vector 最终包含 1,000,000 个元素,这也是潜在下溢堆栈的好方法。在您的第一个示例中,image
vector 也将在每次循环中被复制构造和破坏。您始终可以使用 -pg 选项编译代码以打开 gprof 数据并检查结果。
关于c++ - 返回元素是否比通过引用发送它们并在那里修改慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20134995/