gpt4 book ai didi

c++ - 使用返回值优化 get 和函数调用的循环?

转载 作者:太空宇宙 更新时间:2023-11-03 10:20:51 26 4
gpt4 key购买 nike

这是一个从缓冲源获取数据并将其发送以供处理的片段。如果队列为空,get() 返回一个 null,process 方法很乐意接受一个 null 而什么都不做。对此进行编码的最佳方式是什么?

something a; // any legal C++ return type...
aQueueOfSomethings g;

while (true) {
a=g.get();
process(a);
}

无法预测通过 get() 到达的值,它们就是它们的本来面目,它们需要尽快出列并传递给 process()。

我在这里没有看到很多浪费的努力 - 如果我跳过名为“a”的显式局部变量并将循环设为单行:

    process(g.get());

g.get() 的隐式返回值仍将分配空间,可能涉及构造函数调用等。

如果返回的东西有任何大小或复杂性,最好有一个指向它的指针而不是它的拷贝,并传递该指针而不是按值传递拷贝......所以我更愿意

something *a;

g.get(a);
process(a);

而不是

 something a;

a=g.get();
process(a);

我用 C++ 写了一个测试用例,尝试了两行和一行版本,循环 100,000,000 次。

如果 a 是一个包含 4 个整数和 2 个 float 的对象,并且 process() 方法接触到它们,两行解决方案实际上更快!如果 a 对象是单个 int,则单行版本更快。如果对象很复杂但 process() 方法只涉及一个值,则单行版本更快。

对我来说最有趣的是,使用 g++ 编译器,Mac OS X 10.5.8,-O 第一级优化开关在 1 行和 2 行版本中产生相同的、更快的操作。

除了让编译器优化,两个方法都在一行中,没有显式中间变量,并通过引用传递以避免复制,还有什么通常可以让它运行得更快?我觉得我错过了一些明显的东西。

最佳答案

我认为这是无用优化的最高案例

(您正在使用缓冲并且想要对其进行位优化的东西?)

此外,编译器会将两种方式编译为完全相同的代码,并且(在大多数情况下)完全有权进行返回值优化尾调用优化。

结合 queue_class::get() 的可能内联,您的问题似乎完全没有意义

关于c++ - 使用返回值优化 get 和函数调用的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5815957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com