在Mac上配置clang ++

时间:2015-11-16 23:42:56

标签: macos xcode7 c++14 clang++

作为一个大学项目,我为各种排序算法编写了一个基本的基准。我必须使用几个编译器标志,如-Wall -g0 -O3和C ++ 14标准。

在某些时候,我意识到一些时间测量没有意义,算法优化没有效果。一位同学在使用GCC的Linux机器上运行相同的代码,并按预期工作。因此,它一定是(现在仍然是)LLVM / clang ++配置问题 - 至少这是我的假设。

所以我检查了我的IDE(Xcode 7.1.1)中的构建设置,甚至编译了shell上的源代码,但问题仍然存在。

最后,我查看了Xcode的报告导航器,并在终端上使用了详细输出(-v)。它揭示了clang ++默认使用许多其他参数:

"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.11.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -disable-free -disable-llvm-verifier -main-file-name Benchmark.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 253.6 -v -dwarf-column-info -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -stdlib=libc++ -O3 -Wall -std=c++14 -fdeprecated-macro -fdebug-compilation-dir /Users/Kruse/Downloads/ProgramOptimization -ferror-limit 19 -fmessage-length 142 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.11.0 -fencode-extended-block-signature -fcxx-exceptions -fexceptions -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops -vectorize-slp -o /var/folders/q4/rj3wqzms2fdcqlxgdzb3l5hc0000gn/T/Benchmark-1912ed.o -x c++ Benchmark.cpp

如何将其剥离至关键部位?还是我走错了路?

这是测试中的代码(不要因为类似于bubort的交换而责怪我 - 这是一个要求):

class InsertionSort {

public:
    template <typename T, size_t SIZE>
    static void sort(std::array<T, SIZE> &field) {
        for (size_t global = 1; global < SIZE; global++) {
            for (size_t sorted = global; sorted > 0
                 && field[sorted] < field[sorted - 1]; sorted--) {
                std::swap(field[sorted], field[sorted - 1]);
            }
        }
    }

    template <typename T, size_t SIZE>
    static void sortGuard(std::array<T, SIZE> &field) {
        size_t minIndex = MinimumSearch::getMin(field);
        std::swap(field[minIndex], field[0]);

        for (size_t global = 2; global < SIZE; global++) {
            for (size_t sorted = global; field[sorted] < field[sorted - 1]; sorted--) {
                std::swap(field[sorted], field[sorted - 1]);
            }
        }
    }

};

最低搜索量如下:

class MinimumSearch {

public:
    template <typename T, size_t SIZE>
    static size_t getMin(std::array<T, SIZE> &field, size_t startIndex = 0) {
        size_t minIndex = startIndex;
        T minVal = field[minIndex];

        for (size_t i = minIndex; i < SIZE; i++) {
            if (field[i] < minVal) {
                minIndex = i;
                minVal = field[i];
            }
        }

        return minIndex;
    }

};

InsertionSort#sortGuard(std::array<T, SIZE>&, size_t)应该比默认排序方法更快。这是使用GCC的情况,但不是LLVM / clang ++。

1 个答案:

答案 0 :(得分:0)

如果您没有安装命令行工具,可以使用terminal命令安装它们:

xcode-select --install

安装完成后,您可以从命令行运行clang,例如:

clang++ -std=c++14 -O3 test.cpp