Why can't GCC optimize out `std::sqrt`?

I have the simple program: #include <cmath> int main() { for (int i = 0; i < 50; ++i) std::sqrt(i); } Clang 3.8 optimizes it out at -O3 , but gcc 6.1 doesn't. It produces the following assembly: ## Annotations in comments added after the question was answered, ## for the benefit of future readers. main: pushq %rbx xorl %ebx, %ebx jmp .L2 .L4:

为什么GCC不能优化`std :: sqrt`?

我有简单的程序: #include <cmath> int main() { for (int i = 0; i < 50; ++i) std::sqrt(i); } Clang 3.8在-O3优化它,但gcc 6.1不会。 它产生以下组件: ## Annotations in comments added after the question was answered, ## for the benefit of future readers. main: pushq %rbx xorl %ebx, %ebx jmp .L2 .L4: pxor %xmm0, %xmm0 # break cvtsi2sd's fal

Optimize templates compilation time in c++/gcc

In a large project we have a lot of classes (thousands), and for each of them a special smart pointer type is defined using typedef. This smart pointer type is a template class. When I compile with "gcc -Q" I see that a lot of time is spent compiling these smart pointers for each class. That is I see smartptr<class1>::methods, then smartptr<class2>::methods... smartptr<

在c ++ / gcc中优化模板编译时间

在一个大型项目中,我们有很多类(数千个),并且每个类都使用typedef定义了一个特殊的智能指针类型。 这个智能指针类型是一个模板类。 当我使用“gcc -Q”进行编译时,我发现每个类都需要花费大量的时间编译这些智能指针。 这就是我看到smartptr<class1>::methods, then smartptr<class2>::methods... smartptr<class2000>::methods在gcc处理它们时在屏幕上滚动。 有没有一个技巧来加速这个过程? 这些类

Why does changing 0.1f to 0 slow down performance by 10x?

Why does this bit of code, const float x[16] = { 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6}; const float z[16] = {1.123, 1.234, 1.345, 156.467, 1.578, 1.689, 1.790, 1.812, 1.923, 2.034, 2.145, 2.256, 2.367, 2.478, 2.589, 2.690}; float y[16]; for (int i = 0; i < 16; i++) { y[

为什么将0.1f改为0会使性能下降10倍?

为什么这一点代码, const float x[16] = { 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6}; const float z[16] = {1.123, 1.234, 1.345, 156.467, 1.578, 1.689, 1.790, 1.812, 1.923, 2.034, 2.145, 2.256, 2.367, 2.478, 2.589, 2.690}; float y[16]; for (int i = 0; i < 16; i++) { y[i] = x[i

Using C++ lambda functions during variable initialisation

I think many of you have this kind of code somewhere: int foo; switch (bar) { case SOMETHING: foo = 5; break; case STHNELSE: foo = 10; break; ... } But this code has some drawbacks: You can easily forget a "break" The foo variable is not const while it should be It's just not beautiful So I started wondering if there was a way to "improve" this kind of co

在变量初始化期间使用C ++ lambda函数

我想很多人都有这种代码: int foo; switch (bar) { case SOMETHING: foo = 5; break; case STHNELSE: foo = 10; break; ... } 但是这个代码有一些缺点: 你可以轻松忘记一个“休息” foo变量不是常量,而应该是 这只是不美丽 所以我开始想知道是否有一种方法来“改善”这种代码,并且我有这样一个想法: const int foo = [&]() -> int { switch (bar) { case SOMETHING: return 5; case STHNELS

What are the c++ compiler optimization techniques in Visual studio

I want to know compiler optimization strategies for generating optimized object code for my c++ app in Visual studio. Currently i am using default settings. In short: the main things you would want to play around with are the /O1 and /O2 flags. They set the optimization to either minimize size or maximize speed. There are a bunch of other settings but you don't really want to be playing

Visual Studio中的c ++编译器优化技术是什么?

我想知道编译器优化策略,用于在Visual Studio中为我的c ++应用程序生成优化的目标代码。 目前我正在使用默认设置。 总之:你想要玩的主要是/ O1和/ O2标志。 他们将优化设置为最小化尺寸或最大化速度。 还有一些其他的设置,但是你并不想真正想玩这些,除非你真的知道你做了什么,并且已经测量,分析并发现改变编译器设置是获得更好性能的最好方法,更小的尺寸。 完整链接:http://social.msdn.microsoft.com/forums/en

c++: why can we declare a variable in case of switch

int i; i = 2; switch(i) { case 1: int k; break; case 2: k = 1; cout<<k<<endl; break; } I don't know why the code above works. Here, we can never go into case 1 but why we can use k in case 2? There are actually 2 questions: 1. Why can I declare a variable after case label? It's because in C++ label has to be in form: N

c ++:为什么我们可以在切换的时候声明一个变量

int i; i = 2; switch(i) { case 1: int k; break; case 2: k = 1; cout<<k<<endl; break; } 我不知道为什么上面的代码工作。 在这里,我们不能进入情况1,但为什么我们可以在情况2中使用k ? 其实有两个问题: 1.为什么我可以在case标签后声明一个变量? 这是因为在C ++标签中必须采用以下形式: N3337 6.1 / 1 标记的语句: ... attribute-spec

Class members and explicit stack/heap allocation

Let's say we have 4 classes as follows: class A { public: A(void) : m_B() { } private: B m_B; } class B { public: B(void) { m_i = 1; } private: int m_i; } class C { public: C(void) { m_D = new D(); } ~C(void)

类成员和显式堆栈/堆分配

假设我们有4个类,如下所示: class A { public: A(void) : m_B() { } private: B m_B; } class B { public: B(void) { m_i = 1; } private: int m_i; } class C { public: C(void) { m_D = new D(); } ~C(void) { de

Why are two different concepts both called "heap"?

Why are the runtime heap used for dynamic memory allocation in C-style languages and the data structure both called "the heap"? Is there some relation? Donald Knuth says (The Art of Computer Programming, Third Ed., Vol. 1, p. 435): Several authors began about 1975 to call the pool of available memory a "heap." He doesn't say which authors and doesn't give refere

为什么两个不同的概念都被称为“堆”?

为什么用于C风格语言的动态内存分配的运行时堆和数据结构都称为“堆”? 有一些关系吗? 唐纳德克努特说(计算机程序设计艺术,第三版,第1卷,第435页): 几位作者于1975年开始将可用内存池称为“堆”。 他没有说出哪些作者,也没有提及任何具体的论文,但确实表示,与优先级队列有关的术语“堆”的使用是传统意义上的单词。 他们有相同的名字,但他们确实不相似(甚至在概念上)。 内存堆被称为堆,就像您将洗衣篮称为“衣

Are these stack allocation or heap allocation?

Possible Duplicate: Does this type of memory get allocated on the heap or the stack? class foo{ private: int bar; constructors and other members here... } If i create an instance of foo using the new operator where it will be created? Heap i guess but where does my int bar; get created, stack or heap? And if my bar wasn't a primitive data type but another object created like this->

这些堆栈分配或堆分配?

可能重复: 这种类型的内存是否被分配到堆或栈上? class foo{ private: int bar; constructors and other members here... } 如果我使用新操作符创建foo的实例,它将在哪里创建? 堆我猜,但我的int bar;在哪里int bar; 获得创建,堆栈或堆? 如果我的bar不是一个原始的数据类型,但另一个对象创建像这样 - this->bar=bar(); ,它会在哪里创建? 阅读内存中如何构造类实例。 这里简单的解释 。 成员是内存中

Where is Heap and Stack on Physical Memory?

I read by some googling about Heap & Stack, but most answer says just its concept description, differences. I am curious other things. as title says, Where is Heap and Stack on Physical Memory? How is their size? For example, I use 12 giga byte memory at my desktop PC, then how much is Heap? and how much is Stack size? Who made these 2 different type concept? Can I manipulate Heap

物理内存堆和堆栈在哪里?

我通过一些关于堆和堆栈的搜索阅读,但大多数答案只是说明了它的概念描述和差异。 我很好奇其他的事情。 正如标题所说,堆和物理内存堆栈在哪里? 它们的大小如何? 例如,我在台式电脑上使用12千兆字节的内存,那么堆是多少? 以及堆栈大小是多少? 谁制造了这两种不同类型的概念? 我可以操纵堆和堆栈的分配吗? 如果它们每个都占用50%的内存(如果Heap占用6千兆字节内存,Stack在我的情况下占用6千兆字节),我