C ++运算符何时真正内联?

时间:2017-10-24 03:06:58

标签: c++ operator-overloading inline

http://cs.brown.edu/~jak/proglang/cpp/stltut/tut.htmlhttp://www.geeksforgeeks.org/c-qsort-vs-c-sort/,我们发现使用STL的排序机制比C&#qsort()更快。

这是因为比较功能是"内联"。但是,当使用https://godbolt.org/处的编译器资源管理器来检查gcc编译器的输出时,我无法让任何运算符实际变为内联。有关示例,请参阅here,代码如下:

#include <string>
#include <algorithm>
#include <vector>
#include <cstdlib>
#include <iostream>

using namespace std;

class myClass {
    public: 

    int key;
    int data;

    myClass(int k, int d) : key(k), data(d) {}

    inline bool operator<(myClass& other) {
        return key < other.key;
    }
};

main () {
    myClass c1(1,100), c2(2, 100);
    if (c1 < c2) cout << "True" << endl;
    else cout << "False" << endl;
}

生成的汇编代码清楚地调用了operator<例程。 C ++编译器完全忽略了inline关键字!

那么,当 运算符内联时?例如,这是获得更快排序性能的关键,但知道如何尽可能利用它会很好。

1 个答案:

答案 0 :(得分:4)

默认情况下,大多数编译器都不会内联任何内容,因为这会妨碍调试。您需要启用优化。

gcc有一些levels of optimizations和许多可单独调整的优化设置,但即使是最简单的"-O1" flag is enough也可以让您的示例内联toy_attributes = Toy.new.attributes.keys.select do |key| key != 'created_at' && key != 'updated_at' end params = toy_attributes.reduce({}) do |params, attr| params[attr] = true; params end toys = params.flat_map do |attribute, value| child.toys.where({attribute => value}) end 函数。 (事实上​​,gcc实际上意识到它可以在编译时确定operator<的结果,并且能够完全丢弃operator<分支!)