首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Mac上配置clang++

在Mac上配置clang++
EN

Stack Overflow用户
提问于 2015-11-17 07:42:56
回答 1查看 679关注 0票数 0

作为一个大学项目,我为各种排序算法写了一个基本的基准测试。我必须使用几个编译器标志,比如-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

我如何才能把它简化到关键部分呢?还是我走错了路?

以下是测试中的代码(不要因为类似冒泡排序的交换而责怪我--这是必需的):

代码语言:javascript
复制
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]);
            }
        }
    }

};

最小搜索的实现方式如下:

代码语言:javascript
复制
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++就不是这样了。

EN

回答 1

Stack Overflow用户

发布于 2015-11-17 23:11:44

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

代码语言:javascript
复制
xcode-select --install

安装后,您可以从命令行运行clang,命令如下所示:

代码语言:javascript
复制
clang++ -std=c++14 -O3 test.cpp
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33746674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档