Nub*_*ake 3 c gcc strict-aliasing
我最近了解了 C 中的严格别名并阅读了这篇文章
但我很困惑何时不想启用严格别名。我使用 GCC 开发嵌入式 C 应用程序,我发现许多项目都有-fno-strict-aliasing添加了发布版本的额外标志,但我不明白为什么他们不想启用严格别名以提高性能。有没有人有一个你不想在 C 中使用严格别名的好例子/情况?
另外,如果我们违反严格别名规则但告诉编译器不要进行任何严格别名优化,这是否意味着它不是未定义的行为?
谢谢
...当人们不想启用严格别名时
严格别名是 C 标准设定的一项要求(或者更确切地说是多项要求)。因此,符合标准的 C 代码必须遵守标准设定的(严格的)别名规则。
编译器可以使用这些规则来优化生成的代码。如果某些 C 代码违反了标准别名规则,编译器可能会生成由于优化而表现异常的代码。大多数编译器都可以选择关闭基于别名规则的优化。
所以答案是:如果你的代码违反了“严格别名”规则,你可以告诉编译器不要根据别名规则进行优化。
这就引出了一个新问题:为什么要编写违反别名规则的代码?
原因之一可能是性能。换句话说 - 如果您确切地知道系统在发生违规情况下将如何表现,并且您的代码通过违规而性能更好,您可能想说:我更喜欢性能而不是标准合规性。
我见过提到的一个例子是(网络)数据包校验和的计算。例如,保存数据包的结构可能包含许多不同的字段,如 mac、ip 等,但要计算某种校验和,您可能希望将数据包视为整数数组。使用诸如 之类的代码很容易做到这一点uint32_t * p = &packet。它违反了别名规则,但只要编译器不根据严格的别名规则进行优化,就可以在目标系统上正常工作。
另一个原因可能是代码的可读性。为了避免违反别名规则,您通常需要编写“一些额外的代码”,例如将事物放入联合中,进行位移和逻辑或计算 int 值等。有些人发现此类代码的可读性和可维护性较差,因此他们更喜欢通过违反别名规则来“编写更简单的代码”(因此在编译器中将其关闭)。
| 归档时间: |
|
| 查看次数: |
2510 次 |
| 最近记录: |