【发布时间】:2015-10-01 03:47:01
【问题描述】:
这与 Determine cause of segfault when using -O3? 有关,在问题中,当使用特定版本的 GCC 使用 -O3 编译时,我在特定函数中发现了段错误。在-O3,使用了向量化指令(在-O2,它们没有使用)。
我想将单个函数包装在较低的优化级别。根据Switching off optimization for a specific function in GCC 4.2.2,我可以做到。但是,按照问题和答案中的各种链接,我没有找到“确切地说,如何去做”的答案。
如何标记单个函数以使用不同的优化级别?
相关,我不想将此函数移动到单独的文件中,然后为其提供不同的 makefile 配方。这样做会打开另一个蠕虫罐,例如仅在某些平台上将其应用于 GCC 4.9。
【问题讨论】:
-
只是备份你真的不想做单独的文件选项,就好像你用不同的选项编译不同的单元,你是在咕咕咕。跨度>
-
对我来说听起来像是XY-problem。如果您的代码在优化方面表现不佳,它很可能表现出未定义的行为。如果没有优化就没有出现实际上是一个不好的迹象。与其试图摆弄优化,不如明确地寻找原因。当然,除非您能证明这是由于编译器中的错误造成的。在这种情况下,问题就出现了,您如何保证此错误不会出现在其他地方。在这里,使用补丁或更新的编译器是正确的方法。
-
@Olaf - 问题出现在
-O3,但不在-O2。在-O3,GCC 使用 SSE 指令。我能说的最好的,vmovdqa需要 128 位对齐的字,但代码不能保证它。当使用这个特定的代码路径时,代码保证数组是 64 位对齐的。使用 Clang 及其未定义的行为清理程序,代码也很干净。我想我正在解决编译器错误。 -
@jww 你是在说 mingw-w64 中的this bug 吗?
-
@Matt - 可能是一样的,但我不确定。我没有 GCC 经验/专业知识可言。 (我已经习惯了只使用 GCC 的事情。当我遇到不是我的错的问题时,这种情况很少见)。
标签: c gcc optimization pragma