gpt4 book ai didi

c - 分配或传递缓冲区?

转载 作者:行者123 更新时间:2023-12-04 05:49:01 26 4
gpt4 key购买 nike

假设缓冲区是一个由多个成员组成的结构,包括一个数组。

使用通常的优化标志进行编译,运行这两个代码片段会产生什么样的性能差异?

buffer buf;
for (int i = 0; i < BIG_ENOUGH_NUMBER; i++) {
init(huge_file, i, &buf);
}

// buf is not used afterward

...

void init(FILE* f, int i, buffer* b) {
... // b is filled using f, according to i
do_something(b);
}

对比
for (int i = 0; i < BIG_ENOUGH_NUMBER; i++) {
init(huge_file, i);
}

...

void init(FILE* f, int i) {
buffer buf;
... // buf is filled from scratch using f, according to i
do_something(&buf);
}

最佳答案

第一个答案是:对它们进行基准测试。

第二个答案是:将它们编译为汇编语言,然后查看源代码。使用和不使用优化标志来执行此操作可能会有所启发。

正如所指出的那样,在这两种情况下 buf在堆栈上。我的一般猜测是第二种情况会稍微快一些(使用我使用的编译器),因为 buf 不必作为参数传递。它确实必须在堆栈上分配,但堆栈分配通常只是函数调用帧的大小略有不同。无论该帧有多大,都必须完成相同数量的工作(调整堆栈指针)。

所以我希望生成的代码的主要区别是在第二种情况下少一条“PUSH”指令,假设有足够的参数,有些必须进入堆栈。 (如果它们都在寄存器中,那就有点不同了。)

可能会受到优化的影响,比如是否buf在每种情况下都在一个寄存器中结束。但是填充 buf 的缺失代码可能会影响这一点,所以我不会推测。

请注意,以上是我基于查看编译器行为的猜测。理论上,只要生成的程序正确运行,编译器就可以按照他们喜欢的方式翻译代码,这使得很难概括他们可能会或可能不会进行哪些优化。

关于c - 分配或传递缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10324955/

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