gpt4 book ai didi

c - 为什么类型双关语被认为是 UB?

转载 作者:行者123 更新时间:2023-12-03 21:49:05 27 4
gpt4 key购买 nike

想象一下:

uint64_t x = *(uint64_t *)((unsigned char[8]){'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'});
我有 read那种类型的双关语是未定义的行为。为什么?我实际上是将 8 个字节的字节重新解释为一个 8 字节的整数。我看不出这与 union 有何不同除了类型双关语是未定义的行为和 union不是?我亲自问过一个程序员同事,他们说如果你在做这件事,要么你知道自己做得很好,要么就是你犯了一个错误。但是社区说这种做法应该永远避免?为什么?

最佳答案

最终的原因是“因为语言规范是这样说的”。你没有资格争论这个。如果这就是语言的方式,那就是它的方式。
如果你想知道这样做的动机,那就是原始 C 语言缺乏任何表达方式,即两个左值不能互为别名(而现代语言的 restrict 关键字仍然很少被大多数用户理解)语言)。无法假设两个左值不能别名意味着编译器无法重新排序加载和存储,并且必须为每次访问对象实际执行从/到内存的加载和存储,而不是将值保存在寄存器中,除非它知道对象的地址从未被占用。
C 的基于类型的别名规则通过让编译器假定不同类型的左值不具有别名,在一定程度上缓解了这种情况。
还要注意,在你的例子中,不仅有类型双关,而且有错位。 unsigned char数组没有固有的对齐方式,因此访问 uint64_t在该地址将是与任何别名规则无关的对齐错误(UB 是另一个原因)。

关于c - 为什么类型双关语被认为是 UB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63422076/

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