gpt4 book ai didi

海湾合作委员会 4.8 : Does -Og imply -g?

转载 作者:行者123 更新时间:2023-12-03 04:34:35 24 4
gpt4 key购买 nike

最近更新了 GCC 4.8 的文档,现在引入了一个新的优化开关 -Og。这个

[..] addresses the need for fast compilation and a superior debugging experience while providing a reasonable level of runtime performance. Overall experience for development should be better than the default optimization level -O0.

此开关是否暗示 -g 还是我必须手动将其添加到我的 CXXFLAGS 中?

最佳答案

查看 GCC 4.9.2 源代码 (gcc/opts.c) 显示 -Og-O1 相同,但带有一些标志禁用这可能会导致更糟糕的调试体验:

/* in function default_options_optimization: */
case OPT_Og:
/* -Og selects optimization level 1. */
opts->x_optimize_size = 0;
opts->x_optimize = 1;
opts->x_optimize_fast = 0;
opts->x_optimize_debug = 1;
break;

几个步骤后,函数 maybe_default_option 被调用,并带有一组选项和 x_optimize_debug 标志。使用 -Og 时,不会启用标有 OPT_LEVELS_1_PLUS_NOT_DEBUGOPT_LEVELS_1_PLUS_SPEED_ONLYOPT_LEVELS_2_PLUS_SPEED_ONLY 的选项。

这就是“应该比 -O0 更好”这句话的出处。 -Og 位于 -O0-O1 之间。这不会影响通过 -g 选项启用的调试信息的包含。您可能还会对不同的 -g 选项感兴趣:

  • 选项-ggdb覆盖-g。也就是说,如果您在 -g 之后设置 -ggdb,则 -g 选项实际上会被忽略。
  • 选项-g等于-g2,省略-g-g0相同。
  • 选项-g3产生比-g2更大的调试部分,-ggdb3针对-ggdb2也是如此.
  • 更高的优化级别会导致代码和调试部分的增加。 (-O0 <-O1 <-Og <-O2 <-O3 )。
  • strip --strip-debug 产生相同的对象大小,与 -g 级别无关。这符合预期,即只有 -O 级别对实际代码有影响,其中 -g 决定调试部分。
  • strip --keep-debug 生成的对象的大小由 -g 级别主导,随后是 -O 级别。 (因此 -g0 -O3 小于 -g3 -O0)。

注意:这里我没有考虑编译的时间。它可能会随着更积极的优化级别而增加。我预计调试级别只会对时间产生很小的影响(与优化相比),因为它只意味着在传递过程中需要跟踪额外的细节。

这是我用来测试实际行为的命令(也比较 -ggdbX 而不是 -gX):

for g in -g0 -g2 -g3;do
for O in -O0 -O1 -O2 -O3 -Og; do
flags="$g $O";
gcc -fPIC -rdynamic -c -Wall -Wextra -Ilib ltunify.c -o obj/gL_"${flags// /_}_.o" $flags || break;
done;
done

关于海湾合作委员会 4.8 : Does -Og imply -g?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12970596/

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