GCC 在开启 -O2 编译优化后,会遇到编译器领域的两个著名问题:严格别名(Strict Aliasing)与整数环绕(Integer Wrap-around)。 本次笔者就为大家详细讲解下这两个经典的编译优化问题。由于作者水平有限,本文不免存在遗漏或错误之处,欢迎指正交流。 1、什么是别名(alias) ...
什么是严格别名(strict aliasing)规则 简单说,严格别名规则就是编译器当看到多个别名(alias)时,会在一定规则下默认它们指向不同的内存区域(即使实际上可能指向相同的区域),并以此进行优化,可能会生成与我们期望不同的代码。 控制严格别名(strict aliasing)规则的编译选项是 -fstrict-aliasing 和-Wstrict-aliasing,该编...
在开启 GCC -O2 编译优化的同时开启 `-fno-strict-aliasing` 编译参数。 其实如果按照 GCC 那帮人的严格别名(Strict Aliasing)标准,Linux 代码有一半都跑不起来。2018 年 Linus Torvalds 就针对 Strict Aliasing 对 GCC 进行了开喷:device property: Get rid of union aliasing 5、整数环绕 在开启 GCC -O2 编...
我申请的就是int通行证,int通行证访问int类型是完全没问题的,他心想。 他查阅员工手册,发现int通行证不仅可以访问int数据,也可以访问其他类型的数据,前提是他必须遵守一个规则:strict-aliasing。 strict-aliasing的规则是这样的:指针只能访问和他通行证上相同类型的数据,或者是一个该类型的超集,比如一个包含该类型的...
strict aliasing strict aliasing一文中将这些条文允许alias总结如下: 1.兼容类型(指相同类型?)或差别仅在于signed、unsigned、const、volatile的类型(比如 const unsigned long *和 long*) 2.聚合类型(struct或class)或联合类型(union)可以alias它们所包含的类型(比如 int 和 包含有int的结构体(包括间接包含))...
“-fstrict-aliasing”表示启用严格别名规则,“-fno-strict-aliasing”表示禁用严格别名规则,当gcc的编译优化参数为“-O2”、“-O3”和“-Os”时,默认会打开“-fstrict-aliasing”。 什么是严格别名规则?gcc对严格别名的定义: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 In particular, an object of...
在C和C++语言中,严格别名(strict aliasing)规则是编译器用于处理多个变量指向同一内存区域的一种机制。当多个左值(lvalue)指向同一内存区域时,就会出现别名(alias)现象。例如,`*intptr`改变时,`anint`的值也会改变,因为`*intpr`是`anint`的别名。另一个例子是`foo(anint,anint)`函数调用...
而当指针指向的对象类型不同时,编译器可以放心地认为指针指向不同的内存,互相不为别名,这就是所谓的strict aliasing:不同类型的指针指向不同的内存块。在这种情况下,编译器可以使用激进的优化策略。 但是C/C++ 经常使用类型转换和指针直接操作内存,有时就会破坏 strict aliasing 规则,导致未定义行为。
因此,使用 -fno-strict-aliasing 的效果可能根本不会对您的性能产生很大影响。也就是说,拥有需要 -fno-strict-aliasing 的代码充其量只是次优情况。 原文由 nielsj 发布,翻译遵循 CC BY-SA 3.0 许可协议 有用 回复 查看全部 2 个回答 推荐问题 如何实现一个深拷贝函数? 在项目开发中,如何实现一个深拷贝函数?
GCC在开启-O2编译优化后,会遇到两个著名问题:严格别名(Strict Aliasing)与整数环绕(Integer Wrap-around)。本篇文章将详细讲解这两个问题。文章可能包含错误或遗漏,欢迎指正。1、别名(alias)概念 在C和C++中,当多个左值指向同一内存区域时,即存在别名。例如:ptr改变a的值也会改变,*ptr被称为...