compiler-optimization相关内容

评论会被翻译成机器码吗?C++

当一个用 C++ 编写的程序有注释时,这些注释是被翻译成机器语言还是永远不会那么远?如果我编写了一个 C++ 程序,在两个命令之间添加了整本书的注释,我的程序是否需要更长的时间来编译或运行更慢? 解决方案 注释通常在预处理期间被删除,因此编译器本身根本看不到它们. 它们可以(并且通常会)稍微减慢编译速度——预处理器必须通读整个注释才能找到它的结尾(因此后续代码将传递给编译器.除非您包 ..

是否有理由不使用链接时优化 (LTO)?

GCC、MSVC、LLVM 和可能的其他工具链支持链接时(整个程序)优化,以允许优化编译单元之间的调用. 编译生产软件时是否有理由不启用此选项? 解决方案 我假设 “生产软件"是指您交付给客户/投入生产的软件.为什么不总是使用编译器优化?(由 Mankarse) 主要适用于您想要调试代码(因此该软件仍处于开发阶段 - 未投入生产). 自从我写下这个答案已经过去了 6 年,需要更 ..
发布时间:2022-01-04 21:25:09 C/C++开发

C++0x 内存模型和推测加载/存储

所以我正在阅读作为即将到来的 C++0x 标准一部分的内存模型.但是,我对允许编译器执行的操作的一些限制感到有些困惑,特别是关于推测加载和存储的限制. 首先,一些相关的东西: Hans Boehm 关于线程和 C++0x 中的内存模型的页面 Boehm,“线程不能作为库实现" Boehm 和 Adve,“C++ 并发内存模型的基础" 萨特,“棱镜:原则-基于 Micr ..
发布时间:2021-12-28 23:03:31 C/C++开发

默认在 CMake 中优化

我有一个 C++ 项目,它使用 CMake 作为其构建系统.我想要以下行为: 如果 cmake 被调用为 cmake ..,那么 CMAKE_CXX_FLAGS 是 -O3 -Wall -Wextra 如果 cmake 被调用为 cmake .. -DCMAKE_BUILD_TYPE=Debug,那么 CMAKE_CXX_FLAGS 是 -g -Wall -Wextra 我尝试了 ..
发布时间:2021-12-26 22:09:02 C/C++开发

在 CMake 中更改 CMAKE_CXX_FLAGS_DEBUG 和朋友的默认值

我想更改 CMake 中 CMAKE_CXX_FLAGS_RELEASE 或 CMAKE_CXX_FLAGS_DEBUG 的默认值.基本上,我有一些项目默认值与 CMake 的(例如发布版)略有不同,我不应该问自己“哦,当使用 add_compile_options 添加时,他们的 -O3 还是我们的 -O2 优先." 现在,我知道如何设置这些值,但我不知道如何通过两种常用方式让用户可以编辑 ..
发布时间:2021-12-26 21:32:20 C/C++开发

为什么 C 编译器不能重新排列结构成员以消除对齐填充?

可能的重复: 为什么 GCC 不优化结构? 为什么 C++ 不使结构更紧凑? 在 32 位 x86 机器上考虑以下示例: 由于对齐限制,下面的结构体 struct s1 {字符一个;国际b;字符 c;字符 d;字符;} 如果成员像这样重新排序,则可以更高效地表示(12 对 8 字节) struct s2 {国际b;字符一个;字符 c;字符 d;字符;} 我知道 C/C++ ..
发布时间:2021-12-23 16:56:41 其他开发

在代码优化期间,C++11 编译器是否会将局部变量转换为右值?

有时将复杂或长的表达式拆分为多个步骤是明智的,例如(第二个版本不是更清楚,但它只是一个示例): return object1(object2(object3(x))); 可以写成: object3 a(x);对象 2 b(a);对象 1 c(b);返回 c; 假设所有 3 个类都实现了以右值作为参数的构造函数,第一个版本可能会更快,因为临时对象被传递并且可以移动.我假设在第二个版本中,局部 ..

/Ox 和/O2 编译器选项之间有什么区别?

Microsoft 的 C++ 编译器(cl.exe,包含在 Visual Studio 中)提供 几个优化开关.它们中的大多数之间的区别似乎不言自明,但我不清楚 /O2(优化代码以获得最大速度)和 /Ox(选择“完全优化"). 我已经尝试阅读 文档 的 /Ox 选项,它似乎确认此开关还可以优化最大速度,而不是大小: /Ox 编译器选项生成的代码有利于执行速度而不是较小的尺寸. ..

原始 new[]/delete[] 与 std::vector 的优化

让我们来处理非常基本的动态分配内存.我们取一个 3 的向量,设置它的元素并返回向量的总和. 在第一个测试用例中,我使用带有 new[]/delete[] 的原始指针.在第二个我使用 std::vector: #include int main(){//int *v = new int[3];//(1)auto v = std::vector(3);//(2)for (int i = 0; ..
发布时间:2021-12-21 13:34:02 C/C++开发

GCC 对读/写指令的重新排序

Linux 的同步原语(自旋锁、互斥锁、RCU)使用内存屏障指令来强制内存访问指令重新排序.这种重新排序可以由 CPU 本身或编译器完成. 有人可以展示一些 GCC 生成的代码示例,其中进行了这种重新排序吗?我主要对 x86 感兴趣.我问这个的原因是为了了解 GCC 如何决定可以重新排序哪些指令.不同的 x86 mirco 架构(例如:sandy 桥 vs ivy 桥)使用不同的缓存架构.因 ..
发布时间:2021-12-21 10:10:41 其他开发

是否可以保证在 C++ 中不会优化执行内存写入的代码?

允许 C++ 编译器优化写入内存: {//所有这些代码都可以消除字符缓冲区[大小];std::fill_n(缓冲区,大小,0);} 在处理敏感数据时,典型的方法是使用 volatile* 指针来确保内存写入由编译器发出.以下是 Visual C++ 运行时库中 SecureZeroMemory() 函数的实现方式 (WinNT.h): FORCEINLINE PVOID RtlSecure ..

为已知的更常见路径优化分支

请考虑以下代码: void error_handling();bool method_impl();布尔方法(){const bool res = method_impl();如果(res == 假){错误处理();返回假;}返回真;} 我知道 method_impl() 会返回 true 99.999%(是的,三位小数),但我的编译器不会.method() 在时间消耗方面是部分关键的. ..
发布时间:2021-12-20 16:26:52 C/C++开发

编译器优化会引入错误吗?

今天我和我的一个朋友讨论了几个小时,关于“编译器优化". 我为有时的观点辩护,编译器优化可能会引入错误,或者至少是不受欢迎的行为. 我的朋友完全不同意,他说“编译器是由聪明的人构建的,做的事情很聪明",因此永远不会出错. 他根本没有说服我,但我不得不承认我缺乏现实生活中的例子来加强我的观点. 谁在这里?如果是,您是否有任何实际示例,其中编译器优化在生成的软件中产生了错误?如 ..

SIMD 指令降低 CPU 频率

我读了这个文章.它谈到了为什么要使用 AVX-512 指令: 英特尔最新的处理器具有高级指令 (AVX-512),可能会导致内核或 CPU 的其余部分运行速度较慢,因为它们使用的功率太大. 我认为在 Agner 的博客上也提到了类似的内容(但我找不到确切的帖子). 我想知道 Skylake 支持的其他指令还有哪些类似的效果,它们会降低功耗以在以后最大化吞吐量?所有 v 前缀指令( ..
发布时间:2021-12-20 15:45:53 其他开发

为什么编译器可以比普通函数更好地优化 lambdas?

在他的书中 The C++ Standard Library (Second Edition) Nicolai Josuttis 指出,与普通函数相比,编译器可以更好地优化 lambda. 此外,C++ 编译器比它们更好地优化了 lambda普通功能.(第 213 页) 这是为什么? 我认为内联应该不再有任何区别.我能想到的唯一原因是编译器可能有更好的 lambda 本地上下文, ..
发布时间:2021-12-20 15:43:43 C/C++开发

pow 函数中发生了什么?

我在这里看到了各种描述 pow 函数在 C 中的奇怪行为的答案. 但我有一些不同的问题要问这里. 在下面的代码中,我初始化了 int x = pow(10,2) 和 int y = pow(10,n) (int n =2). 在第一种情况下,当我打印结果时,它显示 100,而在另一种情况下,它显示的是 99. 我知道 pow 返回 double 并且它在存储在 int 中被截断 ..
发布时间:2021-12-18 23:17:01 其他开发

为什么增强的 GCC 6 优化器会破坏实用的 C++ 代码?

GCC 6 有一个新的优化器功能:它假设 this始终不为 null 并基于此进行优化. 值范围传播现在假定 C++ 成员函数的 this 指针为非空.这消除了常见的空指针检查但也破坏了一些不符合规范的代码库(例如 Qt-5、Chromium、KDevelop).可以使用 -fno-delete-null-pointer-checks 作为临时解决方法.可以使用 -fsanitize=und ..
发布时间:2021-12-18 23:05:16 C/C++开发