compiler-optimization相关内容
当一个用 C++ 编写的程序有注释时,这些注释是被翻译成机器语言还是永远不会那么远?如果我编写了一个 C++ 程序,在两个命令之间添加了整本书的注释,我的程序是否需要更长的时间来编译或运行更慢? 解决方案 注释通常在预处理期间被删除,因此编译器本身根本看不到它们. 它们可以(并且通常会)稍微减慢编译速度——预处理器必须通读整个注释才能找到它的结尾(因此后续代码将传递给编译器.除非您包
..
GCC、MSVC、LLVM 和可能的其他工具链支持链接时(整个程序)优化,以允许优化编译单元之间的调用. 编译生产软件时是否有理由不启用此选项? 解决方案 我假设 “生产软件"是指您交付给客户/投入生产的软件.为什么不总是使用编译器优化?(由 Mankarse) 主要适用于您想要调试代码(因此该软件仍处于开发阶段 - 未投入生产). 自从我写下这个答案已经过去了 6 年,需要更
..
所以我正在阅读作为即将到来的 C++0x 标准一部分的内存模型.但是,我对允许编译器执行的操作的一些限制感到有些困惑,特别是关于推测加载和存储的限制. 首先,一些相关的东西: Hans Boehm 关于线程和 C++0x 中的内存模型的页面 Boehm,“线程不能作为库实现" Boehm 和 Adve,“C++ 并发内存模型的基础" 萨特,“棱镜:原则-基于 Micr
..
我有一个 C++ 项目,它使用 CMake 作为其构建系统.我想要以下行为: 如果 cmake 被调用为 cmake ..,那么 CMAKE_CXX_FLAGS 是 -O3 -Wall -Wextra 如果 cmake 被调用为 cmake .. -DCMAKE_BUILD_TYPE=Debug,那么 CMAKE_CXX_FLAGS 是 -g -Wall -Wextra 我尝试了
..
我想更改 CMake 中 CMAKE_CXX_FLAGS_RELEASE 或 CMAKE_CXX_FLAGS_DEBUG 的默认值.基本上,我有一些项目默认值与 CMake 的(例如发布版)略有不同,我不应该问自己“哦,当使用 add_compile_options 添加时,他们的 -O3 还是我们的 -O2 优先." 现在,我知道如何设置这些值,但我不知道如何通过两种常用方式让用户可以编辑
..
可能的重复: 为什么 GCC 不优化结构? 为什么 C++ 不使结构更紧凑? 在 32 位 x86 机器上考虑以下示例: 由于对齐限制,下面的结构体 struct s1 {字符一个;国际b;字符 c;字符 d;字符;} 如果成员像这样重新排序,则可以更高效地表示(12 对 8 字节) struct s2 {国际b;字符一个;字符 c;字符 d;字符;} 我知道 C/C++
..
我想使用内在函数比较两个浮点变量.如果比较为真,就做点别的做点什么.我想将其作为正常的 if..else 条件来执行.有没有办法使用内在函数? //普通代码向量v1, v2;for(int i = 0; i
..
有时将复杂或长的表达式拆分为多个步骤是明智的,例如(第二个版本不是更清楚,但它只是一个示例): return object1(object2(object3(x))); 可以写成: object3 a(x);对象 2 b(a);对象 1 c(b);返回 c; 假设所有 3 个类都实现了以右值作为参数的构造函数,第一个版本可能会更快,因为临时对象被传递并且可以移动.我假设在第二个版本中,局部
..
Microsoft 的 C++ 编译器(cl.exe,包含在 Visual Studio 中)提供 几个优化开关.它们中的大多数之间的区别似乎不言自明,但我不清楚 /O2(优化代码以获得最大速度)和 /Ox(选择“完全优化"). 我已经尝试阅读 文档 的 /Ox 选项,它似乎确认此开关还可以优化最大速度,而不是大小: /Ox 编译器选项生成的代码有利于执行速度而不是较小的尺寸.
..
为什么在 Visual C++ 中没有完全应用空基类优化 (EBO)? 如果我有很多基类,有什么办法可以帮助编译器做这个优化吗? #include 结构 T1 { };结构 T2 { };结构 T3 { };结构 T4 { };结构 T5 { };结构 T6 { };结构测试:T1、T2、T3、T4、T5、T6{};int main() { std::cout
..
让我们来处理非常基本的动态分配内存.我们取一个 3 的向量,设置它的元素并返回向量的总和. 在第一个测试用例中,我使用带有 new[]/delete[] 的原始指针.在第二个我使用 std::vector: #include int main(){//int *v = new int[3];//(1)auto v = std::vector(3);//(2)for (int i = 0;
..
Linux 的同步原语(自旋锁、互斥锁、RCU)使用内存屏障指令来强制内存访问指令重新排序.这种重新排序可以由 CPU 本身或编译器完成. 有人可以展示一些 GCC 生成的代码示例,其中进行了这种重新排序吗?我主要对 x86 感兴趣.我问这个的原因是为了了解 GCC 如何决定可以重新排序哪些指令.不同的 x86 mirco 架构(例如:sandy 桥 vs ivy 桥)使用不同的缓存架构.因
..
允许 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() 在时间消耗方面是部分关键的.
..
今天我和我的一个朋友讨论了几个小时,关于“编译器优化". 我为有时的观点辩护,编译器优化可能会引入错误,或者至少是不受欢迎的行为. 我的朋友完全不同意,他说“编译器是由聪明的人构建的,做的事情很聪明",因此永远不会出错. 他根本没有说服我,但我不得不承认我缺乏现实生活中的例子来加强我的观点. 谁在这里?如果是,您是否有任何实际示例,其中编译器优化在生成的软件中产生了错误?如
..
我读了这个文章.它谈到了为什么要使用 AVX-512 指令: 英特尔最新的处理器具有高级指令 (AVX-512),可能会导致内核或 CPU 的其余部分运行速度较慢,因为它们使用的功率太大. 我认为在 Agner 的博客上也提到了类似的内容(但我找不到确切的帖子). 我想知道 Skylake 支持的其他指令还有哪些类似的效果,它们会降低功耗以在以后最大化吞吐量?所有 v 前缀指令(
..
在他的书中 The C++ Standard Library (Second Edition) Nicolai Josuttis 指出,与普通函数相比,编译器可以更好地优化 lambda. 此外,C++ 编译器比它们更好地优化了 lambda普通功能.(第 213 页) 这是为什么? 我认为内联应该不再有任何区别.我能想到的唯一原因是编译器可能有更好的 lambda 本地上下文,
..
我在这里看到了各种描述 pow 函数在 C 中的奇怪行为的答案. 但我有一些不同的问题要问这里. 在下面的代码中,我初始化了 int x = pow(10,2) 和 int y = pow(10,n) (int n =2). 在第一种情况下,当我打印结果时,它显示 100,而在另一种情况下,它显示的是 99. 我知道 pow 返回 double 并且它在存储在 int 中被截断
..
我最近遇到了这个精彩的 cpp2015 演讲 CppCon 2015:Chandler Carruth“调整 C++:基准,以及CPU 和编译器!天哪!" 提到的防止编译器优化代码的技术之一是使用以下函数. static void escape(void *p) {asm volatile("" : "g"(p) : "memory");}静态无效破坏(){asm volatile(""
..
GCC 6 有一个新的优化器功能:它假设 this始终不为 null 并基于此进行优化. 值范围传播现在假定 C++ 成员函数的 this 指针为非空.这消除了常见的空指针检查但也破坏了一些不符合规范的代码库(例如 Qt-5、Chromium、KDevelop).可以使用 -fno-delete-null-pointer-checks 作为临时解决方法.可以使用 -fsanitize=und
..