为了账号安全,请及时绑定邮箱和手机立即绑定

为什么优化会破坏此功能?

为什么优化会破坏此功能?

C++ C
料青山看我应如是 2019-08-27 16:25:50
为什么优化会破坏此功能?我们最近在大学里开了一个关于多种语言编程特色的讲座。讲师写下了以下功能:inline u64 Swap_64(u64 x){     u64 tmp;     (*(u32*)&tmp)       = Swap_32(*(((u32*)&x)+1));     (*(((u32*)&tmp)+1)) = Swap_32(*(u32*) &x);     return tmp;}虽然我完全理解这在可读性方面也是非常差的风格,但他的主要观点是这部分代码在生产代码中运行良好,直到它们实现了高优化级别。然后,代码将什么都不做。他说,变量的所有赋值tmp都将由编译器优化。但为什么会这样呢?我知道有些情况下变量需要声明为volatile,这样编译器就不会触及它们,即使他认为它们永远不会被读或写,但我不知道为什么会发生这种情况。
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

在C ++中,如果指针参数char*指向基本上不同的类型(“严格别名”规则,则假定它们不是别名(除外)。这允许一些优化。

在这里,u64 tmp永远不会被修改为u64
的内容u32*被修改,而可以是无关的“ u64 tmp”这样可以被看作nop用于u64 tmp

查看完整回答
反对 回复 2019-08-27
?
潇湘沐

TA贡献1816条经验 获得超6个赞

g ++(Ubuntu / Linaro 4.8.1-10ubuntu9)4.8.1:

> g++ -Wall -std=c++11 -O0 -o sample sample.cpp> g++ -Wall -std=c++11 -O3 -o sample sample.cpp
sample.cpp: In function ‘uint64_t Swap_64(uint64_t)’:sample.cpp:10:19: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
     (*(uint32_t*)&tmp)       = Swap_32(*(((uint32_t*)&x)+1));
                   ^sample.cpp:11:54: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
     (*(((uint32_t*)&tmp)+1)) = Swap_32(*(uint32_t*) &x);
                                                      ^

Clang 3.4没有在任何优化级别发出警告,这很奇怪 ......


查看完整回答
反对 回复 2019-08-27
  • 3 回答
  • 0 关注
  • 458 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信