- 主题:c/cpp真是一不小心就踩雷
这不是显然的么,编译器认为*h=5之后没有赋值操作,if判断直接可以省略,最基础的编译优化
你要加volatile避免编译器触碰才行
--
FROM 111.198.57.*
很多类似这种代码的上古遗留trick其实都不符合语言标准,古代编译器优化手段少,可能压根就不做优化,可能能work,放到现代就坏了
给lz指条路,单就这个例子,违反的是strict alias原则
【 在 DreamDreams 的大作中提到: 】
: 从哪开始学的一半对哪里的禁忌了解得就比较多
: 一开始就学带gc的高级语言,基本上啥禁忌都没有,那可不就觉得啥都是坑
:
--
FROM 111.198.57.*
百度strict alias,规则不难理解,记不住也没关系,遇到这种情况一概不要挑战编译器 要么volatile避免一切优化,要么多敲两行字 该用union用union,要么用uint8_t按字节访问也不会有问题,要么老老实实memcpy/memcmp
就这个例子解释strict alias的原则,如果两个形参都是long *,那它们是有可能指向同一个对象的,编译器不会做过度推测这两个对象不相等,因此不会出现歧义。但如果像你写的两个形参一个short*一个long*,根据原则这两个不兼容的引用不应当指向同一个内存对象,因此编译器可以做合理推测进行优化
例外是uint8_t char uchar这几个单字节类型的指针,允许与其他任意类型做alias,方便直接内存操作
【 在 stub 的大作中提到: 】
: 你如果short改成long就不是未定义
--
修改:eggcar FROM 111.198.57.*
FROM 111.198.57.*