c++ - 返回元素是否比通过引用发送它们并在那里修改慢?

标签 c++ optimization gcc compiler-construction clang

假设我有一个生成大结构的函数(在本例中是一个巨大的 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/

相关文章:

c++ - 你能举个例子说明什么时候真的需要 auto_ptr_ref 吗?

c++ - 如何将整数变量转换为 QTime 对象

c++ - 为什么 ostringstream 不清空?

java - 在 Java 中 : do expressions involving constants defined at instantiation get simplified during compile-time?

c++ - GCC 不能使用未定义的运算符=

c++ - 海湾合作委员会 assembly "+t"

java - JNA:字符数组作为函数参数

javascript - 优化 Javascript 中所有英语单词集合大小的最有效方法是什么?

Scala 2.10 基准测试 : generic methods from the collections are useless when performance is important?

c - 使用 openMP 库运行 C 代码时出错