c – 这是g中的优化错误吗?
我不确定我是否在g(4.4.1-4ubuntu9)中发现了一个错误,或者我是否正在做 启用优化后,我有一个失败的ASSERT.什么时候 系统 >语言:C 优化已启用 编译对象: 这是来自objdump -dg file.o的相关代码.
优化已禁用 现编译:
原始C代码 这是原始C的消毒版本.我刚刚更改了一些名字
如果您认为我已经过度混淆或消除了太多,请告诉我.用户 问题 所以,我的问题是,对任何人来说,它看起来像一个错误的优化吗? 如果它有用,我可以发布原始C代码的消毒版本. 这是我第一次发布Stack Overflow,所以如果我能做的话请告诉我 答案 编辑(事后几天): 我在下面接受了我的问题的答案 – 这不是g中的优化错误,我只是看错了汇编代码. 但是,对于将来可能会看到这个问题的人,我找到了答案.我在C(http://blog.regehr.org/archives/213和http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html)中对未定义的行为进行了一些阅读,并且编译器的一些描述使用未定义的行为优化掉函数似乎非常熟悉. 我在函数’helper_function’中添加了一些NULL指针检查,并且看到…… bug消失了.我应该开始使用NULL指针检查,但显然没有让它们允许g做任何想做的事情(在我的情况下,优化掉调用). 希望这些信息有助于未来的人. 最佳答案 我觉得你在看错了.我想编译器注意到你的函数很短并且没有触及%rdi寄存器所以它只是不管它(你有与第一个参数相同的变量,我想这是放在%rdi中的内容.参见第21页这里http://www.x86-64.org/documentation/abi.pdf)如果查看未优化的版本,它会在此行保存%rdi寄存器
…然后在调用helper_function之前,它将保存的值移动到移动到%rdi的%rax中.
在优化它时,编译器就可以摆脱所有来回移动. (编辑:岳阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c – `libusb_attach_kernel_driver`无效
- 如何确保我的Linux程序不产生核心转储?
- linux – 陷阱标志(TF)和监视器陷阱标志之间的区别?
- linux – 在Docker容器中挂载SMB / CIFS共享
- linux – 获取打开特定文件的应用程序列表
- 如何在Linux Ubuntu上配置Cassandra的访问权限
- 从tmux会话中的vim复制的文本用右边的空格填充
- Getting over the dangers of rm command in Linux---refer
- 在Linux上,有什么比`find`或`diff -r`更快的方式来查看目录
- linux – 如何在同一时间运行不同版本的node.js?