compiler-optimization相关内容

如果我针对大小而不是速度进行优化,为什么 GCC 生成的代码速度会快 15-20%?

我在 2009 年第一次注意到 GCC(至少在我的项目和我的机器上)如果我针对大小(-Os) 而不是速度(-O2 或 -O3),我一直想知道为什么. 我已经设法创建(相当愚蠢的)代码来显示这种令人惊讶的行为,并且代码足够小,可以在此处发布. const int LOOP_BOUND = 200000000;__attribute__((noinline))静态 int add(const ..
发布时间:2021-12-18 23:04:12 C/C++开发

如何关闭 gcc 编译器优化以启用缓冲区溢出

我正在做作业问题 需要禁用编译器优化保护才能工作.我在 ubuntu linux 上使用 gcc 4.4.1,但无法确定哪些标志是正确的.我意识到它依赖于架构 - 我的机器使用 32 位英特尔处理器运行. 谢谢. 解决方案 这是个好问题.为了解决该问题,您还必须禁用 ASLR,否则 g() 的地址将不可预测. 禁用 ASLR: sudo bash -c 'echo 0 >/p ..
发布时间:2021-12-18 23:00:20 其他开发

是否可以告诉分支预测器跟随分支的可能性有多大?

为了清楚起见,我不会在这里寻求任何形式的可移植性,因此任何将我绑定到某个盒子的解决方案都可以. 基本上,我有一个 if 语句,该语句在 99% 的时间评估为真,并且我试图勉强维持每一个性能时钟,我可以发出某种编译器命令吗(使用 GCC 4.1.2 和 x86ISA,如果重要的话)告诉分支预测器它应该为那个分支缓存? 解决方案 是的.http://kerneltrap.org/node ..
发布时间:2021-12-18 22:40:15 其他开发

如何查看哪些标志 -march=native 将激活?

我正在使用 GCC 4.3 编译我的 C++ 应用程序.我使用 -march=native 而不是手动选择优化标志,理论上应该添加适用于我正在编译的硬件的所有优化标志.但是我如何检查它实际使用了哪些标志? 解决方案 您可以使用 -Q --help=target 选项: gcc -march=native -Q --help=target ... -v 选项也可能有用. 您可以查看 ..
发布时间:2021-12-18 22:37:14 其他开发

字符串文字的 C 优化

我刚刚在 gdb 中检查了以下内容: char *a[] = {“一"、“二"、“三"、“四"};char *b[] = {“一"、“二"、“三"、“四"};char *c[] = {“二"、“三"、“四"、“五"};char *d[] = {“一"、“三"、“四"、“六"}; ...我得到以下信息: (gdb) p a$17 = {0x80961a4“一"、0x80961a8“二"、0x8 ..
发布时间:2021-12-18 22:35:34 其他开发

什么 C/C++ 编译器可以使用 push pop 指令来创建局部变量,而不是仅仅增加一次 esp?

我相信 push/pop 指令会产生更紧凑的代码,甚至可能会运行得稍微快一些.不过,这也需要禁用堆栈帧. 为了检查这一点,我需要手工重写一个足够大的汇编程序(比较它们),或者安装和研究一些其他编译器(看看他们是否有这个选项,并比较结果). 这是关于此问题和类似问题的论坛主题. 简而言之,我想了解哪种代码更好.代码如下: sub esp, cmov [esp+8],eaxmov ..

C 中的浮点运算是否具有关联性?

加法在数学上保持关联属性: (a + b) + c = a + (b + c) 在一般情况下,此属性不适用于浮点数,因为它们以有限精度表示值. 在从 C 程序生成机器代码作为优化的一部分时,是否允许编译器进行上述替换?在 C 标准中它到底在哪里说的? 解决方案 编译器不允许执行“优化",这会导致计算出的值与根据抽象机器语义计算出的值不同. 5.1.2.3 程序执行 [ ..
发布时间:2021-12-17 15:07:05 其他开发

gcc/g++ 中的尾递归

我尝试搜索,但找不到:函数的必要条件是什么,以便 gcc 优化尾递归?是否有任何参考或列表包含最重要的案例?由于这是特定于版本的,我感兴趣的是 4.6.3 或更高版本(越新越好).然而,事实上,任何具体的参考将不胜感激. 提前致谢! 解决方案 启用 -O2 后,如果可能,gcc 将执行尾调用优化.现在的问题是:什么时候可能? 只要递归调用发生在(单个)return 语句之前或内 ..
发布时间:2021-12-16 08:47:56 其他开发

如何在 Haskell 中使 CAF 不是 CAF?

我如何将一个常量应用形式变成,嗯,而不是一个常量应用形式,以阻止它在程序的生命周期内被保留? 我已经尝试过这种方法: -- |避免创建 CAF 的虚拟参数twoTrues :: () ->[[[布尔]]]twoTrues _ = map (++ (True : repeat False)) .trueBlock [1..] 但它似乎不起作用 - 配置文件显示它仍被保留并且仍将其标记为 C ..
发布时间:2021-12-14 11:55:50 其他开发

GCC(/Clang):合并具有相同指令的函数(COMDAT 折叠)

只是好奇,GCC 或 Clang 工具集是否实现了等效于 MSVC 的 相同的 COMDAT 折叠 (ICF) 目前?如果没有,有什么计划吗?除了旧的 GCC 邮件列表消息之外,我似乎找不到任何有关该主题的最新权威链接. 如果不是,这是否意味着在不同类型上的模板实例化在生成的二进制文件中总是不同的函数(在它们没有完全内联的情况下),即使它们是二进制兼容的,或者是否有其他机制在其他层面处理这个 ..
发布时间:2021-12-13 18:39:32 其他开发

是否允许编译器回收释放的指针变量?

有人声称 在realloc 被释放之后,编译器可以自由地将指针变量重用于其他目的,因此您不能保证它具有与之前相同的值之前 即 void *p = malloc(42);uintptr_t 地址 = (uintptr_t)p;免费(p);//[...] 与 p 或地址无关的东西断言((uintptr_t)p == 地址); 可能会失败. C11 附件 J.2 读取 一个指 ..

程序员什么时候使用空基优化(EBO)

我正在阅读有关空基优化 (EBO) 的内容.在阅读的过程中,我的脑海中浮现出以下问题: 当它对派生类没有任何贡献(无论是功能方面还是数据方面)时,使用 Empty 类作为基类有什么意义? 在 这篇文章,我读了这个: //S为空 类结构 T : S { int x; }; [...] 请注意,我们没有丢失任何数据或代码准确性:当您创建一个S 类型的独立对象,对象 ..

为什么在单独循环中按元素添加比在组合循环中快得多?

假设a1、b1、c1和d1指向堆内存,我的数字代码有以下核心循环. const int n = 100000;for (int j = 0; j 此循环通过另一个外部 for 循环执行 10,000 次.为了加快速度,我将代码更改为: for (int j = 0; j 在 Microsoft Visual C++ 10.0 上编译,经过全面优化和 SSE2 在 Intel Core ..
发布时间:2021-12-08 11:05:47 C/C++开发

为什么编译器不合并冗余的 std::atomic 写入?

我想知道为什么没有编译器准备将相同值的连续写入合并到单个原子变量,例如: #include std::atomicy(0);无效 f() {自动订购 = std::memory_order_relaxed;y.store(1, 订单);y.store(1, 订单);y.store(1, 订单);} 我尝试过的每个编译器都会发出上述写入的 3 次.哪个合法的、无种族的观察者可以看到上述代码与经过 ..
发布时间:2021-12-06 11:31:59 C/C++开发

最终赋值的 C 循环优化帮助(禁用编译器优化)

因此,对于我在计算机系统课程中的最终作业,我们需要优化这些 for 循环,使其比原始循环更快. 使用我们的 linux 服务器,基本成绩在 7 秒以内,满级成绩在 5 秒以内.我在这里的这段代码大约需要 5.6 秒.我想我可能需要以某种方式使用指针来让它运行得更快,但我不太确定.任何人都可以提供我的任何提示或选项吗? 文件必须保持在 50 行或更少,我将忽略教师包含的那些注释行. # ..
发布时间:2021-12-02 08:01:57 其他开发

用 64 位替换 32 位循环计数器会在 Intel CPU 上使用 _mm_popcnt_u64 引入疯狂的性能偏差

我一直在寻找popcount 大型数据数组的最快方法.我遇到了一个非常奇怪的效果:将循环变量从 unsigned 更改为 uint64_t 使我的 PC 上的性能下降了 50%. 基准 #include #include #include int main(int argc, char* argv[]) {使用命名空间标准;如果(argc!= 2){cerr(endP-st ..
发布时间:2021-11-30 11:15:44 C/C++开发